C++(指针数组、数组指针)
在C++中,指针数组和数组指针是两个不同的概念,它们的名字虽然相似,但含义和使用方式都有明显的区别。以下是详细的介绍和区别:
1. 指针数组
指针数组(Array of Pointers)是一个数组,其中的每个元素都是一个指针。它用于存储指向某种类型的数据的指针。
例如,一个指向整数的指针数组可以这样定义:
int* arr[5];
在这个例子中,arr
是一个包含 5 个指针的数组,每个指针都指向一个整数。你可以这样使用它:
int a = 1, b = 2, c = 3, d = 4, e = 5;
int* arr[5] = { &a, &b, &c, &d, &e };
for (int i = 0; i < 5; ++i) {
std::cout << *arr[i] << " "; // 输出 1 2 3 4 5
}
std::cout << std::endl;
2. 数组指针
数组指针(Pointer to an Array)是指向数组的指针。它用于指向一个数组的首地址。
例如,一个指向包含 10 个整数的数组的指针可以这样定义:
int (*ptr)[10];
在这个例子中,ptr
是一个指向包含 10 个整数的数组的指针。你可以这样使用它:
int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int (*ptr)[10] = &arr;
for (int i = 0; i < 10; ++i) {
std::cout << (*ptr)[i] << " "; // 输出 0 1 2 3 4 5 6 7 8 9
}
std::cout << std::endl;
2.1 *ptr[i]
与(*ptr)[i]
的区别
在 C++ 中,*ptr[i]
和 (*ptr)[i]
的含义不同,主要体现在对指针的解引用和数组下标操作的优先级上。
-
*ptr[i]
:- 这个表达式先会计算
ptr[i]
,它表示访问指针ptr
所指向的第i
个元素。 ptr[i]
实际上是等价于*(ptr + i)
,即访问指针ptr
所指向的地址加上i
个单位后的元素。- 然后,对
ptr[i]
的结果应用解引用操作*
,即访问ptr[i]
指向的元素。
例如,如果
ptr
是一个指向指针的指针(int** ptr
),那么ptr[i]
是int*
类型的指针,然后*ptr[i]
是int
类型的值。 - 这个表达式先会计算
-
(*ptr)[i]
:- 这个表达式首先会解引用
ptr
,得到*ptr
,这意味着*ptr
是指向数组的指针(假设ptr
是int**
,那么*ptr
是int*
)。 - 然后,对
*ptr
这个指针应用下标操作[i]
,即访问*ptr
指向的数组中第i
个元素。
例如,如果
ptr
是一个指向指针的指针(int** ptr
),那么*ptr
是int*
,而(*ptr)[i]
是int
类型的值,等价于*( (*ptr) + i)
。 - 这个表达式首先会解引用
-
示例:
int arr[3] = {1, 2, 3}; int* ptr[3] = {&arr[0], &arr[1], &arr[2]}; // ptr 是一个 int* 数组 int** pptr = ptr; // pptr 是一个指向 int* 的指针 // 使用 *ptr[i] int value1 = *ptr[1]; // 等价于 *(ptr[1]),即 *(&arr[1]),结果是 arr[1],值为 2 // 使用 (*ptr)[i] int value2 = (*pptr)[1]; // 等价于 *( (*pptr) + 1 ),即 *(ptr + 1),结果是 ptr[1],值为 2
总的来说,*ptr[i]
是对数组中每个元素进行解引用操作,而 (*ptr)[i]
是先解引用指向数组的指针,然后访问数组元素。
3. 区别总结
-
定义方式不同:
- 指针数组:一个数组,其中的每个元素都是指针。例如
int* arr[5]
。 - 数组指针:一个指向数组的指针。例如
int (*ptr)[10]
。
- 指针数组:一个数组,其中的每个元素都是指针。例如
-
使用方式不同:
- 指针数组:用于存储多个指针,可以指向不同的内存地址。
- 数组指针:用于指向一个数组,可以通过解引用访问数组的元素。
-
功能不同:
- 指针数组:常用于需要存储多个指针的场景,例如动态分配多个对象的指针。
- 数组指针:常用于传递数组的首地址,例如作为函数参数传递大数组以避免复制整个数组。
通过理解这两个概念的区别,可以更好地选择和使用它们来解决特定的编程问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)