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] 的含义不同,主要体现在对指针的解引用和数组下标操作的优先级上。

  1. *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 类型的值。

  2. (*ptr)[i]

    • 这个表达式首先会解引用 ptr,得到 *ptr,这意味着 *ptr 是指向数组的指针(假设 ptrint**,那么 *ptrint*)。
    • 然后,对 *ptr 这个指针应用下标操作 [i],即访问 *ptr 指向的数组中第 i 个元素。

    例如,如果 ptr 是一个指向指针的指针(int** ptr),那么 *ptrint*,而 (*ptr)[i]int 类型的值,等价于 *( (*ptr) + i)

  3. 示例:

    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. 区别总结

  1. 定义方式不同

    • 指针数组:一个数组,其中的每个元素都是指针。例如 int* arr[5]
    • 数组指针:一个指向数组的指针。例如 int (*ptr)[10]
  2. 使用方式不同

    • 指针数组:用于存储多个指针,可以指向不同的内存地址。
    • 数组指针:用于指向一个数组,可以通过解引用访问数组的元素。
  3. 功能不同

    • 指针数组:常用于需要存储多个指针的场景,例如动态分配多个对象的指针。
    • 数组指针:常用于传递数组的首地址,例如作为函数参数传递大数组以避免复制整个数组。

通过理解这两个概念的区别,可以更好地选择和使用它们来解决特定的编程问题。



posted @   做梦当财神  阅读(703)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示