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]。
- 指针数组:一个数组,其中的每个元素都是指针。例如
-
使用方式不同:
- 指针数组:用于存储多个指针,可以指向不同的内存地址。
- 数组指针:用于指向一个数组,可以通过解引用访问数组的元素。
-
功能不同:
- 指针数组:常用于需要存储多个指针的场景,例如动态分配多个对象的指针。
- 数组指针:常用于传递数组的首地址,例如作为函数参数传递大数组以避免复制整个数组。
通过理解这两个概念的区别,可以更好地选择和使用它们来解决特定的编程问题。

浙公网安备 33010602011771号