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

C语言中的多级指针、指针数组与数组指针

在C语言中,指针是一个非常重要的概念,它为我们提供了直接操作内存地址的能力。通过指针,我们可以访问和修改内存中的数据,实现各种灵活的操作。本文将通过示例代码和详细解释,深入探讨C语言中的多级指针、指针数组和数组指针。

1. 多级指针

多级指针是指指向指针的指针。在C语言中,我们可以定义一个指针变量来存储另一个变量的地址,同样,我们也可以定义一个指针变量来存储另一个指针变量的地址。这就是所谓的二级指针,以此类推,还可以有三级指针、四级指针等。

示例代码:

int a = 20;
int *p = &a;    // 一级指针,指向变量a
int **pp = &p;  // 二级指针,指向一级指针p
int ***ppp = &pp; // 三级指针,指向二级指针pp
printf("%d \n", ***ppp); // 输出20

这里,我们通过三级指针ppp访问到了最初的变量a的值。需要注意的是,每增加一级指针,我们就需要多使用一个*来解引用。

2. 指针数组

指针数组是指数组中的每个元素都是一个指针。指针数组在C语言中常用于存储字符串、函数指针等。

示例代码:

int a1 = 10, b1 = 2, c1 = 3;
int *arr[] = {&a1, &b1, &c1}; // 定义一个指针数组,存储三个整型变量的地址
printf("%d\n", *arr[0]); // 输出10,访问指针数组的第一个元素所指向的值

int **p2 = arr; // 二级指针指向指针数组
printf("%d\n", **p2); // 输出10,通过二级指针访问指针数组的第一个元素所指向的值

这里,我们定义了一个指针数组arr,它存储了三个整型变量的地址。然后,我们定义了一个二级指针p2,让它指向指针数组arr,通过**p2访问到了指针数组的第一个元素所指向的值。

3. 数组指针

数组指针是指向数组的指针。在C语言中,数组名本身就是一个指向数组首元素的指针,但是数组指针和指向数组元素的指针是不同的。数组指针是指向整个数组的指针,它的步长是整个数组的大小。

示例代码:

int arr2[] = {111, 222, 333};
int(*pa)[3] = &arr2; // 定义一个数组指针,指向包含3个整数的数组
printf("%d %d %d\n", *(*pa + 0), *(*pa + 1), *(*pa + 2)); // 输出111 222 333

int arr3[][3]={{11,22,33},{44,55,66}};
int (*p3)[3]=arr3;
printf("%d\n",*(*(p3+1)+2)); // 输出66,通过数组指针访问二维数组的元素
printf("%d\n",p3[1][2]);    // 输出66,直接通过数组名访问二维数组的元素

这里,我们定义了一个数组指针pa,让它指向一个包含3个整数的数组。通过*(*pa + i)的方式,我们可以访问数组中的元素。需要注意的是,*pa表示的是整个数组的首地址,*pa + i表示的是数组中第i个元素的地址,*(*pa + i)表示的就是对应地址上的值了。

同样地,我们还展示了如何通过数组指针访问二维数组的元素。需要注意的是,p3+1表示的是跳过整个一行,因此*(p3+1)表示的是第二行的首地址,*(*(p3+1)+2)表示的就是第二行第三列的元素了。

总结

本文介绍了C语言中的多级指针、指针数组和数组指针的概念和用法。通过示例代码和详细解释,我们可以看到指针在C语言中的灵活性和强大之处。多级指针可以让我们间接地访问和修改内存中的数据;指针数组可以存储多个指针,常用于存储字符串、函数指针等;数组指针可以让我们以整个数组为单位进行操作,提供了更高的效率和灵活性。


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

相关文章:

  • 飞天使-k8s知识点15-kubernetes散装知识点4-CNI网络插件与kubectl
  • 【Git版本控制 01】基本操作
  • MinIO数据迁移
  • 【前端web入门第四天】01 复合选择器与伪类选择器
  • 代码随想录算法——数组
  • 2024年华为OD机试真题-螺旋数字矩阵-Java-OD统一考试(C卷)
  • scss和less的区别
  • 精通Python爬虫:掌握日志配置
  • pycharm deployment 灰色 一直无法点击
  • linux系统定时任务管理
  • 多线程JUC:线程池原理、自定义线程池详细解析
  • 设计模式巡礼:多板适配案例解析与深度重构
  • 熔断机制解析:如何用Hystrix保障微服务的稳定性
  • abap - 发送邮件,邮件正文带表格和excel附件
  • 年底我被裁了,大环境不好?
  • 【芯片设计- RTL 数字逻辑设计入门 14 -- 使用子模块实现三输入数的大小比较】
  • router路由跳转的两种模板2.0版本
  • 2.2-学成在线内容管理之课程分类查询+新增课程
  • Linux 36.2@Jetson Orin Nano之Hello AI World!
  • 蓝桥杯刷题day06——平均
  • Peter算法小课堂—枚举优化
  • 前端工程化之:webpack3-5(css module)
  • Redis(十二)Bigkey
  • Qt信号和槽机制(什么是信号和槽,connect函数的形式,按钮的常用信号,QWidget的常用槽,自定义槽函数案例 点击按钮,输出文本)
  • 基于 Python opencv 的人脸识别的酒店客房入侵系统的检测
  • 电脑服务器离线安装.net framework 3.5解决方案(错误:0x8024402c )(如何确定当前系统是否安装NET Framework 3.5)
  • STM32学习笔记——定时器
  • 力扣36.有效的数独
  • AD9361多片同步设计方法
  • Android Studio 安装Flutter插件但是没法创建项目