工作中遇到这么个事👇
#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 = #
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 = #
printf("%p",p);//0x112233
理解下面两行:
p == (0x112233) (×)
p == (int*)(0x112233) (√)
p本身包含一个int[4]大小的跨度,
尽管p+1与p的地址相差16个字节,
但是他们相减完之后的变量是int[4]类型,
会以16个字节为一个单位去解释。
如果换成char*,会以1个字节为一个单位去解释
*/
总结就是
指针不能单纯理解成“存储地址”
它作为一个C变量,是有类型的存在。