指针进阶知识超详细讲解(C语言)(中)

前言
苦苦等待,终于迎来了我们的指针讲解第二期,如果有还没有看过上一期的小伙伴,那赶紧点击这个链接学习后再来看这篇博客吧。指针基础知识超详细讲解(C 语言)(上)
如果对学习C语言有兴趣那千万不要忘记关注本专栏哦。O(∩_∩)O (也关注下博主吧!): C语言学习专栏

在这里插入图片描述

文章目录

  • 1,多级指针
  • 2,一维数组传参的本质和数组名的含义
  • 3,指针数组
  • 4,数组指针
  • 5,二维数组传参的本质
  • 6,尾声

上一篇博客我们学习了基本的指针类型,指针的加减运算,以及野指针的成因和避免野指针的方法。今天这一篇博客我们将进一步学习指针。那么久让我们开始吧!

1,多级指针

首先让我们写先一个简单的指针变量。
int a = 10;
int* pa =&a;
这里的int* 代表pa的数据类型是整形指针。那么这个呢?
int* * ppa = pa;
我们知道pa存的地址会指向整形变量a,所以我们用int类型来定义pa,如果我们要吧pa的地址在储存在一个指针变量中,那么我们就应该用int * *来定义ppa,int *指得意思是ppa存的地址指向的变量的数据类型就是int *类型的,之后的 *的意思是指ppa是个指针。
那么这么定义ppa的意思就是ppa是一个储存 数据类型为int 的变量的地址 的指针。
这个就是二级指针。
那我们再定义一个指针。
int
* * * pppa = ppa;
与上面同理,ppa就是一个三级指针,两级以上的指针就被我们称为多级指针。
我们知道从pa中取出a我们要解引用 * pa=a
那么我们要从ppa中取出a就要这样解引用 * ( * ppa)= * pa = a
pppa同理。

2,一维数组传参的本质和数组名的含义

假如这里有一个函数,它的参数是一个数组,我们要如何传递这个参数呢?可以看看下面的示范。

#include<stdio.h>
viod test(int arr[])
{
;
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
test(arr);
return 0;
}

我肯可以看到我们直接将数组名传到函数中了,这是个什么原理呢?接下来我来为大家介绍数组名的本质。
当arr单独存在时,它代表数组首元素的地址,我们将arr作为参数传过去实际上是把arr数组的首地址传了过去,那么这时候大家会疑惑?既然我传过去的是地址,为什么我要把参数设置为int arr[ ]呢?实际上int arr[ ]等价于int * arr也就是说,我们也可以把参数的格式写成int * arr。
但是也有特例的情况比如我们要打印数组大小的时候会写出这样一段代码。
printf(“%zd”,sizeof(arr));
此时arr也是单独存在的,但是这是他并不是数组首元素的地址,而是代表整个数组,除了这种情况以外,数组名单独出现都代表数组首元素的地址。
既然这样&arr代表着什么呢?我们不妨写下这么一段代码测试一下。

#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%p %p",arr,&arr);
return 0;
}

在这里插入图片描述

我们会发现两者的地址是一样的难道&arr代表首元素的地址么?那我们对各自地址+1在打印看看。

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%p %p %p",arr, arr+1, &arr+1);return 0;
}

在这里插入图片描述
可以看出结果却不一样arr+1相较于arr多了4,刚好是一个整形的大小,而&arr+1比起arr缺多了整整40,正好是整个数组的大小。对&arr+1跳过了整个数组的大小。说明&arr是整个数组的地址。
既然arr单独出现时代表数组首元素的地址,那么我们对arr进行解引用,我们就会得到数组的首元素 。 * arr = 1
那个对arr+1解引用自然就是数组的第二个元素了 *arr+1 = 2
那么我们就会发现 * arr 与 arr[0]与 * arr+0是等价的, * arr+1与arr[1]是等价的。当我们想通过循环打印整个数组时我们就可以这么写。

for(int i = 0;i <= 9 ;i++)
{
printf("%d",*arr+i);
}

3,指针数组

指针数组,顾名思义是个数组,整形数组里面装的是整形,字符数组里装的是字符,那么指针数组里装的自然就是指针。最基本的整形指针数组是这样定义的(数组里的元素是整形指针)。
int* arr[10] ;(arr是数组名,数组中有十个元素)
我们可以在其中存入整形指针。

4,数组指针

数字指针,显然它是个指针,他储存的是一个数组的地址,我们先来定义一个整形数组指针(存的是整形数组的地址)来做个示范吧。
int arr[2]={1,2};
int ( * parr)[2] = &arr;([ ]的优先级高于*,所以要把*parr用括号()括起来表明parr是指针,[2]指该数组指针指向的数组有两个元素)
那么数组指针加减运算会有什么结果呢?

int main()
{int arr[4] = { 1,2,3,4 };int(*parr)[4] = &arr;printf("%p %p", parr, parr + 1);return 0;
}

在这里插入图片描述

我们会发现刚好+了16,正好是arr数组的大小,可见对parr+1会跳过整个数组的大小。
如果对parr解引用,那么我们就会得到数组arr的地址,即arr首元素的地址。

5,二维数组传参的本质

首先我们可以把二维数组理解为一个一维数组,而这个一维数组里面每一个元素都是一个一维数组,即二维数组的每一行都是他的一个元素。对arr解引用会得到其第一个元素的地址,即第一行的一维数组。对arr+1解引用则会得到第二行的一维数组的地址。
在这里插入图片描述

我们将二维数组传参是可以有着两种写法。

void test(int(*parr)[2])
void test (int arr[][2])//行数可以不写但是列数必须写

这两种写法是完全等价的,因为* parr = arr [ 0 ]= * arr+0 **parr = arr[0][0]=**arr.
对二维数组传参其实传的是二维数组第一行的地址。
*((*parr+1)+1)就等价于 arr[1][1]。

6,尾声

经过这篇博客,想必大家对数组和指针的了解有了进一步的加深,认为博主写的不错的千万不要忘记关注博主等待指针讲解(下),希望大家都能够学好指针(指针很重要),想着自己的目标再进一步!
最终期冲冲冲!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198393.shtml

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

相关文章

如何在Linux环境搭建本地SVN服务器并结合cpolar实现公网访问

目录 前言 1. Ubuntu安装SVN服务 2. 修改配置文件 2.1 修改svnserve.conf文件 2.2 修改passwd文件 2.3 修改authz文件 3. 启动svn服务 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射本地端口 5. 测试公网访问 6. 配置固定公网TCP端口地址 6.1 保留一个固定…

GEE:Sobel算子卷积

作者&#xff1a;CSDN _养乐多_ 本文将深入探讨边缘检测中的一个经典算法&#xff0c;即Sobel算子卷积。我们将介绍该算法的基本原理&#xff0c;并演示如何在Google Earth Engine中应用Sobel算子进行图像卷积操作。并以试验区NDVI为例子&#xff0c;研究区真彩色影像、NDVI图…

【GIT】.gitignore 在忽略目录中放开某目录

示例&#xff1a;忽略build下面的所有目录&#xff0c;只放开build/ast2500-default/workspace/recipes-phosphor/ 目录 .gitignore 实现文件代码 # 忽略 build 目录下的所有目录 # 并放开build/ast2500-default/workspace/recipes-phosphor/ build/* !build/ast2500-defaul…

轮询分区的设置

终于可以写MPI了&#xff0c;没想到&#xff0c;刚开始就当头一棒&#xff0c;我按照之前的配置MPI环境&#xff0c;配置完成就报错 好家伙&#xff0c;仔细检查了每一个步骤都没找到问题&#xff0c;上网搜索了一些解决方案&#xff0c;也没有解决。所幸&#xff0c;在配置MPI…

关于前端学习的思考-vertical-align的用法

先摆结论&#xff1a;vertical-align这里的top线&#xff0c;bottom线&#xff0c;middle线&#xff0c;baseline线是由最大宽度和最大高度的行内元素或行内块元素决定的。 按照惯例&#xff0c;先摆三个行内元素。 1、改变第一个盒子&#xff0c;vertical-align&#xff1a;to…

主机装ubuntu双系统,无线网络问题

微星主板开机按del进入bios&#xff0c;setting里设置启动优先级 启动盘制作 350G 三个分区&#xff1a; 1.EFI系统分区&#xff0c;2G&#xff0c;逻辑分区&#xff0c;空间起始位置 2.Ext4&#xff0c;/&#xff0c;根目录&#xff0c;120G&#xff0c;主分区&#xff0c…

Java异常详解大全(2023版)

Java异常详解 异常分类1.Throwable2. Error(错误)3. Exception(异常)3.1 运行时异常 RuntimeException3.2 编译时异常(受检查异常)ClassNotFoundException + IOException4.常见的运行时异常5.异常如何处理Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

人工智能学习6(贝叶斯实现简单的评论情感分析)

编译工具PyCharm 文章目录 编译工具PyCharm 文本分析与表示实现方式&#xff1a;文本表示方法文本相似度计算LDA主题模型 朴素贝叶斯算法应用&#xff1a;评论情感分析&#xff0c;工具评论分析是好评还是差评获取数据加载停用词内容标准化&#xff08;将每一句话划分成一个个的…

四通道轨-轨运算芯片 D8054,外围应用简便,低功耗2.3mA (典型值)运放供电电流

D8054是一款四通道轨-轨运算放大器&#xff0c;外围应用简便&#xff0c;价格低廉。封装形式为SOP14&#xff0c;TSSOP14&#xff0c; SOP16&#xff0c; TSSOP16。 主要特点&#xff1a; ● 轨-轨输出&#xff0c;输出失调2mV (典型值) ● 高速250MHz&#xff0c;-3dB带…

HNU-电路与电子学-2018期末A卷(含标准解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“数…

“上云”还是“下云”?探云计算的下一站未来!

引言 10 月 27 日&#xff0c;X&#xff08;原Twitter&#xff09;工程技术发布帖子称&#xff0c;在过去的一年里&#xff0c;技术团队优化了 X 的云服务使用方式&#xff0c;着手将更多工作负载迁往本地基础设施。这一转变使 X 每月的云成本降低了 60%。所有媒体、Blob 存储均…

[全志]更新bootlogo分区数据从而更新bootlogo

一、需求 在不进行镜像烧录的情况下&#xff0c;通过启动项或脚本将已存在于主板的bootlogo文件更新到bootlogo分区中&#xff0c;从而实现bootlogo的更新 二、操作 1、在主板上查找bootlogo文件路径 find -name bootlogo* 实机效果&#xff1a; 2、进入文件夹路径 cd ./d…

视频剪辑方法:AI智剪高效稳定,视频批量处理有技巧

随着社交媒体的兴起和视频制作工具的普及&#xff0c;视频剪辑已经成为一项重要的工作。然而对于许多非专业创作者来说&#xff0c;视频剪辑可能是一项困难的任务。所幸AI智剪提供了一种高效稳定的视频剪辑方法&#xff0c;使得视频批量处理变得更加简单。使用AI智剪可以大大节…

派对的最大快乐值

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 派对的最大快乐值 &#x1f48e;总结 派对的最大快乐值 题目 员工信息的定义如下&#xff1a; 公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、没有环的多叉树。树的头节点是公…

蓝桥杯物联网竞赛_STM32L071_10_温度传感器扩展模块

原理图&#xff1a; 温度传感器原理图&#xff1a; 其中芯片可以通过SCL和SDA引脚通过I2C通信向温度传感器指定地址获取温度的模拟量 再利用公式将模拟量转换成相应温度即可 实验板接口原理图&#xff1a; 模拟量转相应温度公式&#xff1a; CubMx配置&#xff1a; Keil配置&…

Ribbon 负载均衡

1、负载均衡整体流程 2、负载均衡流程逐级跟踪运行 (1) LoadBlanced 注解可以使LoadBalancerInterceptor拦截到&#xff1b; (2)LoadBalancerInterceptor 实现了ClientHttpRequestInterceptor接口&#xff1b; (3)ClientHttpRequestInterceptor接口释义如下&#xff1b; (4)int…

金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC]

文章目录 金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责…

TIA博途中快速修改变量值的方法和技巧

TIA博途中快速修改变量值的方法和技巧 如下图所示,正常情况下选中该变量,然后右击选择“修改”—然后选择修改为0或1, 快速调试技巧: 如下图所示,鼠标选中该变量上方的“FALSE”,直接双击,系统会提示是否进行切换该变量的值, 点击“是”即可切换变量的值, 如下图所示,…

第三期丨酷雷曼无人机技能培训

第3期无人机技能提升培训 2023年9月15日&#xff0c;第三期酷雷曼合作商无人机技能提升培训圆满举办&#xff0c;数十位来自各地的合作商齐聚北京&#xff0c;在酷雷曼总部的帮助下学习无人机理论及实操知识&#xff0c;并成功取得权威认可的无人机飞行执照。本届培训会的新晋…