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 333int 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.mzph.cn/news/676188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

话题:IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? 1. 以下是一些在IT行业中我认为具有高含金量的证书: 思科认证(Cisco Certifications):思科认证是由网络领域的著名厂商——Cisco公司推出的,是互联网领域的国际权威认证。这个认证体系包含…

ICLR 2024 | Harvard FairSeg:第一个研究分割算法公平性的大型医疗分割数据集

近年来,人工智能模型的公平性问题受到了越来越多的关注,尤其是在医学领域,因为医学模型的公平性对人们的健康和生命至关重要。高质量的医学公平性数据集对促进公平学习研究非常必要。现有的医学公平性数据集都是针对分类任务的,而…

openssl3.2 - exp - buffer to BIO

文章目录 openssl3.2 - exp - buffer to BIO概述笔记END openssl3.2 - exp - buffer to BIO 概述 openssl的资料看的差不多了, 准备将工程中用到的知识点整理一下. openssl中很多API是以操作文件作为输入的, 也有很多API是以BIO作为输入的. 不管文件是不是受保护的, 如果有可…

VUE学习——事件处理

事件分为内联事件和方法事件。 我们可以使用【v-on】&#xff08;简写&#xff1a;&#xff09;来处理。 内联 <button v-on:click"count">按钮</button><button click"count">按钮</button><p>{{ count }}</p>方法

新年新展望

去年其实是收获颇丰的一年&#xff0c;除了工作中各项工作都得到了很大的推进&#xff0c;个人生活中也有很多变化&#xff0c;其中还拿到了功能安全工程师的证书&#xff0c;以及功能安全经理的证书。 展望一下2024年准备输出的内容&#xff0c;一个是对ISO26262的解读&#x…

【力扣】回文数,反转一半数字 + 字符串

回文数原题地址 方法一&#xff1a;反转一半数字 考虑特殊情况&#xff1a; 负数不是回文数&#xff0c;如 -123 &#xff0c;反过来为 321- 。个位数为零的非零数不是回文数&#xff0c;比如 120 &#xff0c;反过来为 021 。 对于一般情况&#xff0c;我们只需要取出后半…

容器基础:Docker 镜像如何保证部署的一致性?

Docker 镜像如何通过固化基础环境、固化依赖性和固化软件启动流程保证部署的一致性 Docker 镜像通过以下三个方面保证部署的一致性&#xff1a; 1. 固化基础环境: 镜像包含构建应用程序所需的所有环境依赖项&#xff0c;例如操作系统、库和工具。构建镜像时&#xff0c;所有…

Rust语言入门(第3篇)

引用与借用 上一篇中&#xff0c;我们介绍了rust的所有权概念&#xff0c;若直接传递变量做函数参数&#xff0c;堆上的变量就会失去所有权&#xff0c;而栈上变量则由于复制&#xff0c;仍有所有权。 fn main(){let b 3;makes_copy(b);println!("after using a variab…

STM32之USART

概述 串口通信&#xff0c;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter &#xff09;&#xff0c;简称UART&#xff1b;而USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步收发传输器。 USAR…

python学习笔记 -- 字符串

目录 一、输出字符串的格式 二、字符串的一些函数 1、len函数&#xff1a;字符串长度 2、查找字符所在位置index 3、某字符在字符串中的个数count 4、字符切片 对字符串进行翻转 -- 利用步长 5、修改大小写字母&#xff1a; 6、判断开头和结尾 7、拆分字符串 一、输出…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

点云——噪声(代码)

本人硕士期间研究的方向就是三维目标点云跟踪&#xff0c;对点云和跟踪有着较为深入的理解&#xff0c;但一直忙于实习未进行梳理&#xff0c;今天趁着在家休息对点云的噪声进行梳理&#xff0c;因为预处理对于点云项目是至关重要的&#xff0c;所有代码都是近期重新复现过。 这…

2022年全国青少年信息素养大赛 第8届Python编程挑战赛(小学组)复赛试题解析

2022年全国青少年信息素养大赛 第8届Python编程挑战赛(小学组)复赛试题解析T1. 分草莓 小明邀请了四个同学一起游玩,带了一盒草莓平均分给大家一起吃,任意输入草莓的数量n,输出每个人可以分到几颗草莓,最后剩下了几颗。 注意: input()内不添加任何参数 只有完全正确才可…

shell脚本之无限计时器

无限计时器 a0while : dolet aecho $asleep 1 done新建一个.sh结尾的文件复制粘贴进去即可使用&#xff01;

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料&#xff0c;是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能&#xff0c;方便学生在学习中进行文档编写、合作项…

Qt安装配置教程windows版(包括:Qt5.8.0版本,Qt5.12,Qt5.14版本下载安装教程)(亲测可行)

目录 Qt5.8.0版本安装教程Qt5.8.0版本下载安装 Qt5.12.2版本安装教程下载安装 Qt 5.14.2安装教程下载安装和创建项目 参考视频 QT为嵌入式系统提供了大量的库和可重用组件。 WPS Office&#xff0c;咪咕音乐&#xff0c;Linux桌面环境等都是QT开发的。 Qt5.8.0版本安装教程 Q…

Kotlin手记(一):基础大杂烩

Kotlin简介 2011年7月&#xff0c;JetBrains推出Kotlin项目&#xff0c;这是一个面向JVM的新语言 2012年2月&#xff0c;JetBrains以Apache 2许可证开源此项目。 2016年2月15日&#xff0c;Kotlin v1.0发布&#xff0c;这被认为是第一个官方稳定版本。 在Google I/O 2017中&am…

探索Spring Validation:优雅实现后端数据验证的艺术

在现代Web应用开发中&#xff0c;数据验证是一项至关重要的任务&#xff0c;确保应用程序接收到的用户输入符合预期规范&#xff0c;不仅能够提高系统的健壮性&#xff0c;也能有效防止潜在的安全漏洞。Spring Framework通过其内置的Spring Validation模块&#xff0c;为我们提…

机器学习系列——(十一)回归

引言 在机器学习领域&#xff0c;回归是一种常见的监督学习任务&#xff0c;它主要用于预测数值型目标变量。回归分析能够通过对输入特征与目标变量之间的关系建模&#xff0c;从而对未知数据做出预测。 概念 回归是机器学习中的一种监督学习方法&#xff0c;用于预测数值型目…

yo!这里是Linux线程保姆级入门介绍

目录 前言 Linux线程基础 线程概念 底层示意图 线程vs进程 Linux线程控制 创建线程 线程ID 线程终止 线程等待 线程分离 Linux线程互斥 背景概念 互斥量mutex 1.相关接口 2.实现原理 可重入vs线程安全 死锁 Linux线程同步 条件变量 生产者消费者模型 基于…