指向数组的指针代表什么?为何自增会指向下一元素?数组内存连续吗?
数组与指针的常见疑问解答
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
相关产品推荐
相关产品推荐

