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

本文解析了指针数组与数组指针的区别,并通过实例说明如何正确使用这些概念。特别是对于指针步长的理解,以及如何避免编译警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值