<ol><li>数组指针通常指指向数组首元素的指针,如int* p = arr,可访问元素且数组传参时退化为该指针。</li></ol>

在C++中,数组与指针的关系密切但容易混淆,尤其是“数组指针”和“指向数组的指针”这类概念。虽然它们听起来相似,但实际含义和用法有明显区别。理解它们的关键在于搞清类型和语法。
数组指针:指向数组元素的指针
通常所说的“数组指针”其实是指 指向数组中某个元素的指针,最常见的是指向数组首元素的指针。例如:
int arr[5] = {1, 2, 3, 4, 5};int* p = arr; // p 指向 arr[0]
这里,p 是一个指向 int 的指针,它保存的是数组首元素的地址。可以通过指针访问数组元素:
- p[0] 等价于 arr[0]
- *(p + 1) 等价于 arr[1]
这种指针常用于函数传参,因为数组在传参时会退化为指向首元素的指针:
立即学习“C++免费学习笔记(深入)”;
void print(int* arr, int size) {for (int i = 0; i cout }
指向数组的指针:指向整个数组的指针
“指向数组的指针”是指 一个指针,它指向的是整个数组对象,而不是单个元素。它的类型包含数组的大小和元素类型。
声明方式如下:
int arr[5] = {1, 2, 3, 4, 5};int (*ptr)[5] = &arr; // ptr 是指向长度为5的int数组的指针
注意:
- &arr 是整个数组的地址,类型是 int (*)[5]
- ptr + 1 会跳过整个5个int的数组
- 解引用 *ptr 得到的是数组 arr 本身,*(ptr) 可以当作 arr 使用
使用示例:
cout区分 arr、&arr[0] 和 &arr
虽然三者值相同(地址一样),但类型不同:
- arr:类型是 int[5],用在表达式中退化为 int*
- &arr[0]:类型是 int*,指向首元素
- &arr:类型是 int (*)[5],指向整个数组
这在函数参数或模板推导中会产生不同行为。
实际应用场景
指向数组的指针常用于多维数组处理。例如二维数组:
int matrix[3][4];int (*p)[4] = matrix; // p 指向 matrix 的第一行(每行是4个int的数组)
这样 p 可以遍历每一行:
for (int i = 0; i for (int j = 0; j cout }基本上就这些。关键是理解指针的类型决定了它如何解释所指向的内存。数组指针关注元素,指向数组的指针关注整个数组结构。搞清类型,就能正确使用。










