C语言:同样是腰椎间,为何指针你如此突出?
指针:因为我优秀啊,哈哈哈…
how old are 指针(怎么老是指针啊),为何指针总能带来这么多的争议?
话不多说,先看代码:
int main()
{
int arr[10] = {1,2,3};
int *p = arr;
//p++;
p = (int *)((int)p+1);
*p = 10;
printf("%d,%d\n",arr[0],arr[1]);
return 0;
}
这段代码里就包含了一个重要的知识:指针+1;
我们来分析一下指针+1在分配地址时会出现什么情况:
1、加一个字节;
2、加一个单元格;
3、加一个数组。
目前我们能想到的也就这么多了,下面一个一个来分析其可能性:
(1)首先是3、加一个数组,也就是指针直接从arr[0]->arr[9],而我们的目的是将arr[1]通过指针+1然后解引用变成10,直接加一个数组好像并不能实现这个功能。
所以我们pass掉这个选项:
1、加一个字节;
2、加一个单元格;
3、加一个数组。
(2)接下来我们看看一次加一个字节:
整型数组的一个字节是4,我们假设指针++之后是加一个字节,那么我们把地址放大之后:
因为在数组中每个地址的值都是按pc小端存放,所以底地址放小数据,放完之后的样子如下:
而此时arr[0]=0xa01;arr[1]=0x0;
转成十进制的结果就是 2561,0;
所以加一个字节也是不可以的
1、加一个字节;
2、加一个单元格;
3、加一个数组。
所以我们只能选择最后一种情况:加一个单元格
这样确实就可实现了指针+1的能力,所以总结一下:
指针+数字,地址需要调整,调整的权重为:sizeof(指针去掉一个*)
看了上面的内容,有没有小伙伴想到,既然指针可以可以±数字,那指针可以±指针吗?先留一点悬念,我们下期再见