【C语言】指针深度理解,你真的懂指针吗?

文章通过一个C语言代码示例解释了指针不仅表示地址,还包含了类型信息。当指针类型为`int(*)[4]`时,`p+1`和`p`之间的跨度是16个字节,但由于类型原因,它们相减得到的结果是以4个int(16字节)为单位。而转换为`char*`时,跨度则按字节计算。总结指出,指针的运算要考虑其类型定义的内存布局。
摘要由CSDN通过智能技术生成

工作中遇到这么个事👇

#include <stdio.h>
int main()
{
    int arr[Size_arr] = {};//一个数组
    int (*p)[4] = (int(*)[4])arr;
	printf("%d\n",(p+1) - p);//输出多少?
    return 0
}

当然这不是项目里的代码,是我改了之后的,当时大概就是这么个情况。

当时我的思路是这样的

int num = 0;
int *p = &num;
printf("p = %p\n",p);//输出0x0001
printf("p + 1 = %p\n",p + 1);//输出0x0005

p+1的跨度一个int对吧,4个字节。
那int(*)[4]的指针跨度就是4个int,也就是16字节呗。
那p+1 - p 就是16呗

然后代码就出BUG了。

为什么呢?

printf("%d\n",((char*)(p+1) - (char*)p));

输出一下这个,迷惑的老鸟应该一下就明白了。

新鸟看这儿👇

/*p,代表的不光是一个地址,还包含类型
    int *p = &num;
    printf("%p",p);//0x112233
    理解下面两行:
    p == (0x112233)             (×)
    p == (int*)(0x112233)       (√)


    p本身包含一个int[4]大小的跨度,
    尽管p+1与p的地址相差16个字节,
    但是他们相减完之后的变量是int[4]类型,
    会以16个字节为一个单位去解释。
    如果换成char*,会以1个字节为一个单位去解释
*/

总结就是
指针不能单纯理解成“存储地址”
它作为一个C变量,是有类型的存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值