下面这段代码有什么问题吗?
int x[3][12];
int *ptr[12];
ptr=x;
答案 0 :(得分:3)
是的,无法使用以下消息进行编译:
'=' : cannot convert from 'int [3][12]' to 'int *[12]'
说明:
这里x
是一个2维的整数数组,而ptr
是一个指向int的指针数组。
语句ptr=x
正在尝试将x
(这是一个2维的int数组)分配给ptr(这是一个指向int的指针数组)。
如果您要将ptr声明为
int (*ptr)[12];
相反,那么ptr将是一个指向int数组的指针,因为指向int数组的指针与int的2维数组基本相同(int数组只是指向第一个数组的指针数组中的元素和一个2维的int数组只是一个指向第一个int数组的指针,然后就会编译。
或者考虑一下:
int x[3][12];
int *ptr[12];
ptr[0] = x[0];
这是对指向int的指针的int数组的有效赋值(请注意,x的第二维与ptr相同的事实不是为什么这样做)
答案 1 :(得分:1)
查看:C pointer to array/array of pointers disambiguation
我对此有点兴趣并做了一个有效的例子:
#include <stdio.h>
int main (int argc, char * argv[])
{
int i,j;
int x[3][12]; // An array of arrays with lenght 12
//int *wrong[12]; // An array of pointers to ints.
int (*ptr)[12]; // A pointer to an array of ints
/* Initialization to consequtive numbers*/
for ( i = 0; i < 12*3; i++)
{
/* Get the first index, and go from there */
int *number = &(x[0][0])+i;
*number = i;
}
/* Iterate throug and check that the pointers are the same */
for ( i = 0; i < 3 ; i ++ )
{
/* This will generate a warning:
* assignment from incompatible pointer type [enabled by default]
*/
ptr = x[i];
fprintf(stderr,"Numbers in ptr: ");
for ( j = 0; j < 12; j ++)
fprintf(stderr,"%2d ", (*ptr)[j]);
fprintf(stderr,"\n");
fprintf(stderr,"Numbers in x: ");
for ( j = 0; j < 12; j ++)
fprintf(stderr,"%2d ", x[i][j]);
fprintf(stderr,"\n");
}
return 0;
}
输出结果为:
Numbers in ptr: 0 1 2 3 4 5 6 7 8 9 10 11
Numbers in x: 0 1 2 3 4 5 6 7 8 9 10 11
Numbers in ptr: 12 13 14 15 16 17 18 19 20 21 22 23
Numbers in x: 12 13 14 15 16 17 18 19 20 21 22 23
Numbers in ptr: 24 25 26 27 28 29 30 31 32 33 34 35
Numbers in x: 24 25 26 27 28 29 30 31 32 33 34 35