今天不谈大数据,刷个C语言题

老张蛋疼的时候就会刷题,他发给我一道题如下:

今天不谈大数据,刷个C语言题_第1张图片

这不就是一道指针数组的题吗?但是从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

你可能感兴趣的:(存储)