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

指向数组的指针代表什么?为何自增会指向下一元素?数组内存连续吗?

数组与指针的常见疑问解答

1. 指向数组的指针具体代表什么?

首先得区分指向数组元素的指针和指向整个数组的指针:

  • 平时我们常用的int* p = arr;里的p是指向数组首元素的指针,它代表数组第一个元素的内存地址,解引用*p就能拿到首元素的值。
  • 而真正指向整个数组的指针是另一种类型,比如int (*p)[5] = &arr;(这里arr是长度为5的int数组),这种指针存储的是整个数组的起始地址,解引用*p得到的是整个数组(此时会隐式转换为指向首元素的指针,除非用sizeof(*p),它会返回整个数组的字节大小,比如5*4=20)。简单说,指向数组的指针是“以整个数组为单位”的地址标识,它的类型信息里包含了数组的长度。

2. 为何指针自增(+1)会指向数组的下一个元素?

这是C/C++指针算术的核心设计:指针的加减操作是基于其指向类型的字节大小来计算偏移量的。
比如:

  • 若p是int*类型(指向int),假设sizeof(int)=4,那么p+1会让指针的地址值增加4字节,正好跳到下一个int元素的起始地址。
  • 若p是char*类型,sizeof(char)=1,p+1就只增加1字节,指向相邻的char元素。
    用代码举例:
int arr[] = {1, 2, 3};
int* p = arr;
printf("%p\n", p);   // 输出首元素地址,比如0x7ffeefbff5c0
p++;
printf("%p\n", p);   // 输出0x7ffeefbff5c4,比之前大4字节,正好指向第二个元素

这种设计就是为了让指针能方便地遍历连续存储的数组元素,不用手动计算字节偏移。

3. 数组的所有元素在内存中都是连续存放的吗?

是的,C/C++标准明确规定:数组的元素在内存中是连续排布的,元素之间没有任何额外的内存间隙。
比如对于int arr[3],&arr[1] - &arr[0]的结果是1(指针差值的单位是元素个数),字节上的差值就是sizeof(int)。这种连续性正是指针算术能正确遍历数组的前提,也是数组和链表等结构的核心区别之一。

内容的提问来源于stack exchange,提问作者Razraaab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:58:22