当前位置: 首页 > article >正文

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 类型元素的数组的指针。


http://www.kler.cn/news/362316.html

相关文章:

  • Linux系列-Linux的常见指令(三)
  • 《使用Gin框架构建分布式应用》阅读笔记:p88-p100
  • Artistic Oil Paint 艺术油画着色器插件
  • LeetCode53:最大子数组和
  • 【JVM】—深入理解G1回收器—回收过程详解
  • Rust的泛型基础与实践
  • C++:模板(2)
  • AI+云原生时代,高校该如何创新教育模式
  • git取消被跟踪的文件并忽略
  • 分享一位教授关于VLAN标签在交换机中的转发原理的教学
  • 线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的几何间隔 公式解析
  • 数据结构与算法:高级数据结构与实际应用
  • <el-input-number> 回车自动失去焦点
  • 如何在Python网络爬虫中处理动态网页?
  • rootless模式下istio ambient鉴权策略
  • Oracle分区表改造(二):通过在线重定义改造为分区表
  • 几何算法系列:空间实体体积计算公式推导
  • Rust : FnOnce、线程池与多策略执行
  • 11.useComponentDidMount
  • neo4j 中日期时间 时间戳处理
  • Android状态栏/通知栏图标白底问题
  • 归并排序 - 非递归实现
  • 代码随想录刷题Day8
  • 基于SSM汽车零部件加工系统的设计
  • bindService 流程学习总结
  • PTA L1系列题解(C语言)(L1_089 -- L1_096)