之前看到一个帖子,问下面这个代码怎么被报错:
int a[5];
int (*b)[];
b = a;
其实这样写如果在GCC下编译的话不会报错,不过会有类型匹配的警告之类的东西。
不过如果代码改成这个样子:
int a[5] = {1,2,3,4,5};
int (*b)[2];
b = a;
printf("%d\n", *((int *)(b+1)));
运行之后会发现不是2,而是3
这个就关系到数组与指针之间的联系与区别了。
数组名其实只是代表一个地址,那个地址就是数组的首地址。
而指针是一个空间,比如在32位机上一般是4B,里面存放的是指向的空间的地址。
b = a;
这个操作,就是把b这个空间里面的东西变成a (a就是一个地址,是个32位的值,可以理解为0x....)
但是b声明的时候是告诉编译器b指向一个数组,这个数组有2个int元素。
所以b+1操作,相当于b里面的值加上了 2*sizeof(int)。
大概就是这样了。