自学内容网 自学内容网

C/C++:指针数组与数组指针

指针数组和数组指针是两个在 C/C++ 中常见但容易混淆的概念。它们的区别主要在于数据的类型和用途。

指针数组 (Array of Pointers)

指针数组是一个数组,数组的每个元素都是指针。简单来说,它是存放指针的数组。数组中的每个指针可以指向不同的变量或数据。

声明形式:
int *arr[5]; // 一个长度为 5 的指针数组,每个元素都是指向 int 类型的指针
解释:

arr 是一个数组,其中的每个元素都是一个 int 类型的指针(即 int*)。它们可以分别指向不同的 int 变量。

int a = 1, b = 2, c = 3;
int *arr[3]; // 一个长度为 3 的指针数组
​
arr[0] = &a; // arr[0] 指向 a 的地址
arr[1] = &b; // arr[1] 指向 b 的地址
arr[2] = &c; // arr[2] 指向 c 的地址
​
printf("%d\n", *arr[0]); // 输出 1
printf("%d\n", *arr[1]); // 输出 2
printf("%d\n", *arr[2]); // 输出 3

最后代码的执行结果:

数组指针 (Pointer to an Array)

数组指针是一个指针,它指向一个数组。简单来说,它是一个指向数组的指针。

声明形式:
int (*p)[5]; // 一个指向包含 5 个 int 类型元素的数组的指针
解释:

p 是一个指针,它指向一个包含 5 个 int 类型元素的数组。注意,p 不是指向单个 int 类型的指针,而是指向整个数组。

int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // p 指向整个数组 arr
​
// 访问数组中的元素
printf("%d\n", (*p)[0]); // 输出 1
printf("%d\n", (*p)[1]); // 输出 2
printf("%d\n", (*p)[2]); // 输出 3

代码执行结果:

这里的 (*p) 表示对指针 p 解引用,这相当于“取出”指针 p 所指向的整个数组(即 arr)。因此,(*p)[0] 等价于 arr[0]。输出结果为 1

为什么需要解引用 (*p)
1.p是一个指向数组的指针,它本身并不直接表示数组,而是一个指向数组的地址。
2.当我们使用 (*p) 进行解引用时,(*p) 的类型就变成了int[5],即一个包含 5 个整数的数组。
3.使用 (*p)[0]、(*p)[1]、(*p)[2]等表示的就是数组中的元素。
总结
  • 指针数组:数组中的每个元素都是指针。例子:int *arr[5],表示一个数组,数组内有 5 个指针,每个指针指向 int 类型的数据。

  • 数组指针:一个指向数组的指针。例子:int (*p)[5],表示一个指向含有 5 个 int 类型元素的数组的指针。


原文地址:https://blog.csdn.net/WolvenSec/article/details/143183592

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!