You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何改变数组指针迭代方式后内存地址会发生变化?

指针操作中首地址差异的问题解析

问题场景

我刚开始学习指针,对细节较为关注。我理解向指针添加整数时,指针会按对应类型的大小偏移(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:42:51