指向二维数组的指针

时间:2011-08-10 13:13:14

标签: c++ arrays pointers multidimensional-array

如何让指针指向二维数组?

以下代码无效。

float a1[2][2] = { {0,1},{2,3}};
float a2[3][2] = { {0,1},{2,3},{4,5}};
float a3[4][2] = { {0,1},{2,3},{4,5},{6,7}};

float** b = (float**)a1;

//float** b = (float**)a2;
//float** b = (float**)a3;

cout << b[0][0] << b[0][1] <<  b[1][0] <<  b[1][1] << endl;

6 个答案:

答案 0 :(得分:4)

a1无法转换为float**。所以你所做的是非法的,不会产生预期的结果。

试试这个:

float (*b)[2] = a1;
cout << b[0][0] << b[0][1] <<  b[1][0] <<  b[1][1] << endl;

这样可行,因为float[M][2]类型的二维数组可以转换为float (*)[2]。它们与M的任何值都兼容。

作为一般规则,对于Type[M][N]Type (*)[N]的任何非负整数值,M可以转换为N

答案 1 :(得分:2)

如果您的所有数组都具有最终尺寸2(如示例所示),那么您可以执行

float (*b)[2] = a1; // Or a2 or a3

答案 2 :(得分:1)

你这样做的方式在c ++中并不合法。你需要有一个指针数组。

答案 3 :(得分:1)

这里的问题是编译器不知道b的尺寸。将a1转换为float **时,信息会丢失。转换本身仍然有效,但您无法使用b [] []。

引用该数组

答案 4 :(得分:0)

您可以明确地执行此操作:

float a1[2][2] = { {0,1},{2,3}};
float* fp[2] = { a1[0], a1[1] };
// Or
float (*fp)[2] = a1;

答案 5 :(得分:0)

尝试将b指定为直接等于a1,这意味着指针b指向指针a1指向的相同内存位置,它们现在带有相同的内存引用,并且您应该能够遍历阵列。