老张蛋疼的时候就会刷题,他发给我一道题如下:
这不就是一道指针数组的题吗?但是从clean code角度看,这TMD写成这样,是搞事情来的。
首先,我们来复习一下傻傻分不清的指针(的)数组和数组(的)指针,从文字角度这也是很难分清,因为没有加修饰语。分清楚了自然就知道答案了。
我们换个角度来看下面的两个例子。
int (*p)[4] :这是表示一个指向整形数组的指针。首先它是一个指针,因为(*p);再次它是一个指向步长为4的数组,因为[4], 那什么是指针的步长? 例如,int a[5][5], int (*p)[5], p = a[0][0],那么 p++就变成了a[1][0];最后它是一个指向整形类型的指针,因为int。
int *p[4] :这是表示一个一维数组内存放着四个指针变量,分别是p[0]、p[1]、p[2]、p[3]。首先它是一个数组,因为[]优先级大于*,先p[4]了;再次它是一个指针类型的数组;最后它是一个指向整形类型的指针的数组。
现在我们来看题,int a[5][5]是一个步长为5的二位数组,&a[4][2]表示走了4X5的步长。
而int (*p)[4], p = a后,&p[4][2]只走了4X4个步长。所以&p[4][2] - &a[4][2]的答案是 -4.
前面说过从clean code角度看,把步长为5的数组赋值给指向步长为4的指针,这写法就不clean. 如果你用gcc编译,它会弹出下面Warning:
array2.c:6:4: warning: assignment from incompatible pointer type [enabled by default]
p = a;
^
正确的写法,还是应该这样:
int a[5][5];
int (*p)[5];
p = a;
如果还分不清指针(的)数组和数组(的)指针,请参考:https://www.cnblogs.com/mq0036/p/3382732.html