数组指针(Pointer to Array)
**数组指针(Pointer to Array)**是指向整个数组的指针,它和普通指针(指向数组的元素)是不同的概念。在 C/C++ 中,数组指针的定义、使用和区别非常重要,尤其是在多维数组、函数参数传递等场景中。
1. 数组指针的基本概念
(1)数组指针的定义
数组指针是指向整个数组的指针,而普通指针指向的是数组的单个元素。
语法:
数据类型 (*指针变量名)[数组大小];
示例:
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr; // p 是指向整个数组的指针
p是一个指向包含 3 个int元素的数组的指针。&arr取的是整个数组的地址,不是arr[0]的地址。
2. 数组指针 vs 普通指针
普通指针 指向数组中的单个元素:
int arr[3] = {1, 2, 3};
int* p1 = arr; // p1 指向 arr[0],即 &arr[0]
数组指针 指向整个数组:
int (*p2)[3] = &arr; // p2 指向整个数组
两者的区别:
| 指针类型 | 指向对象 | 访问方式 |
|---|---|---|
int* p1 = arr; | 数组的第一个元素 arr[0] | p1[i] 或 *(p1 + i) |
int (*p2)[3] = &arr; | 整个数组 arr | (*p2)[i] |
3. 数组指针的访问方式
(1)普通指针访问数组
#include <iostream>
int main() {
int arr[3] = {1, 2, 3};
int* p1 = arr; // 指向 arr[0]
std::cout << "p1[1] = " << p1[1] << std::endl; // 2
std::cout << "*(p1 + 1) = " << *(p1 + 1) << std::endl; // 2
return 0;
}
✅ p1 指向 arr[0],可以像数组一样访问 p1[i]。
(2)数组指针访问数组
#include <iostream>
int main() {
int arr[3] = {1, 2, 3};
int (*p2)[3] = &arr; // p2 指向整个数组
std::cout << "(*p2)[1] = " << (*p2)[1] << std::endl; // 2
std::cout << "*(*p2 + 1) = " << *(*p2 + 1) << std::endl; // 2
return 0;
}
✅ 数组指针 p2 需要先解引用 (*p2)[i] 才能访问元素。
4. 多维数组中的数组指针
数组指针在多维数组中的作用更加明显。
(1)指向二维数组的指针
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*p)[3] = arr; // p 是指向一个包含 3 个元素的数组的指针
p指向arr[0](即int[3])。p + 1指向arr[1](即int[3])。- 访问
arr[i][j]可以写成*(*(p + i) + j)。
(2)二维数组访问示例
#include <iostream>
int main() {
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*p)[3] = arr; // 指向一个包含 3 个 int 元素的数组
std::cout << "p[1][2] = " << p[1][2] << std::endl; // 6
std::cout << "*(*(p + 1) + 2) = " << *(*(p + 1) + 2) << std::endl; // 6
return 0;
}
✅ 在二维数组中,p[i][j] 仍然可以直接使用。
5. 数组指针作为函数参数
在 C++ 中,不能直接传递整个数组到函数,但可以使用数组指针。
(1)普通指针作为参数
void func(int* p) {
std::cout << p[1] << std::endl; // 访问第二个元素
}
✅ 适用于一维数组。
(2)数组指针作为参数
void func(int (*p)[3]) {
std::cout << (*p)[1] << std::endl; // 访问第二个元素
}
✅ 适用于多维数组,确保数组大小匹配。
(3)示例代码
#include <iostream>
void printArray(int (*p)[3]) { // p 是指向含 3 个 int 的数组的指针
for (int i = 0; i < 3; ++i) {
std::cout << (*p)[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[3] = {1, 2, 3};
printArray(&arr); // 传递整个数组的地址
return 0;
}
✅ 数组指针可以确保函数接收到的数组大小一致!
6. 关键区别总结
| 指针类型 | 定义 | 指向的内容 | 访问方式 |
|---|---|---|---|
| 普通指针 | int* p = arr; | arr[0] | p[i] or *(p + i) |
| 数组指针 | int (*p)[3] = &arr; | arr 整个数组 | (*p)[i] or *(*p + i) |
| 指向二维数组的指针 | int (*p)[3] = arr; | arr[0](一行) | p[i][j] or *(*(p + i) + j) |
7. 结论
- 数组指针指向整个数组,而普通指针指向数组的元素。
- 使用
int (*p)[N] = &arr;让p指向整个数组arr。 - 数组指针常用于多维数组,或作为函数参数,确保数组大小匹配。
- 可以用
(*p)[i]访问数组指针指向的数组元素。
✅ 掌握数组指针,可以更灵活地处理多维数组、函数传参等场景!🚀
3086

被折叠的 条评论
为什么被折叠?



