如何让指针指向二维数组?
以下代码无效。
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;
答案 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指向的相同内存位置,它们现在带有相同的内存引用,并且您应该能够遍历阵列。