为何改变数组指针迭代方式后内存地址会发生变化?
指针操作中首地址差异的问题解析
问题场景
我刚开始学习指针,对细节较为关注。我理解向指针添加整数时,指针会按对应类型的大小偏移(如int类型偏移4字节),但我无法理解以下操作中首元素地址为何会变化。
第一段代码及输出
#include <stdio.h> int main() { int arr[] = {10,20,30,40,50}; int *ptr = arr; int i; for(i=0;i<5;i++) { printf("%d\n", ptr); ptr++; } return 0; }
输出:
6422016
6422020
6422024
6422028
6422032
第二段代码及输出
修改循环后的代码:
for(i=0;i<5;i++) { printf("%d\n", ptr+i); }
输出:
6422000
6422004
6422008
6422012
6422016
疑问:为何会得到不同的地址?我原以为至少首地址会相同。ptr+i和ptr++的操作是否存在差异?
问题解析
1. 两次运行首地址不同的原因
这是操作系统**地址空间随机化(ASLR)**的正常行为:每次启动程序时,系统会随机调整栈内存的分配位置,数组arr作为栈上变量,它的起始地址自然会不一样。这个差异和指针操作无关,是程序运行环境的机制导致的。
2. ptr++与ptr+i的本质差异
这两个操作的核心区别在于是否修改指针本身的存储值:
ptr++会永久修改指针指向:
每次执行ptr++,ptr变量存储的地址会直接向后偏移一个int类型的大小(4字节)。在第一个循环中,第一次打印的是初始首地址,之后每次打印的都是ptr已经偏移后的地址,循环结束后ptr会指向数组末尾的下一个位置。ptr+i只是临时计算偏移地址:ptr本身的存储值不会发生任何改变,每次只是用初始的ptr地址加上i个int的偏移量,计算出一个临时地址用于打印。所以第二个循环中,所有打印的地址都是从初始首地址开始的连续偏移,ptr全程保持指向数组首元素。
内容的提问来源于stack exchange,提问作者DevKara
相关产品推荐
相关产品推荐

