指针 (四)

news2025/2/5 17:53:25

一 . 指针的使用和传值调用

(1)strlen 的模拟实现

库函数 strlen 的功能是求字符串长度,统计的是字符串中 ' \0 ' 之前的字符个数,函数原格式如下:

我们的参数 str 接收到一个字符串的起始地址,然后开始统计字符串中 ' \0 ' 之前的字符个数,最终返回长度。现在我们来模拟实现 strlen 函数,只要从起始地址开始,向后逐个遍历字符,每遇到一个字符,判断其是否为 ' \0 ',若不是,则计数器 + 1,是则停止

(2)传值调用和传址调用

这两个的区别,我们可以通过一道题深入理解:

写一个函数,交换两个整型变量的值:

1 . 传值调用:

上图就是传值调用,看似没有问题,但我们的运行结果却出乎了我们的意料,a、b 的值并没有按照我们预想的那样交换,这是为什么呢?我们可以通过调试中的监视来观察观察:

在上方两个调试的图中,我们可以看到,在我们的 Swap1 中,的的确确是将我们的 x、y 的值进行了交换,但是我们也可以看到,a、b (实参)的地址和 x、y (形参)的地址是截然不同的,这就证明,a、b 和 x、y 有着本质上的区别,我们改变的是在 Swap1 中的 x、y ,并不是我们想要改变的 a、b(地址不同,证明 a、b 和 x、y 向内存申请的空间并不是同一块空间,这两者之间没有必要联系

这里就引出一个重要概念:当实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改不影响实参!!!

我们想要通过一个函数来达到交换变量值的目的,我们应该打破表象看本质,从变量的地址下手,用另一种方法——传址调用

1 . 传址调用:

如图,使用传址调用时,我们通过调试可以看到,a、b 和 *pa、*pb 的地址是一样的,通过地址去改变这两个变量的值,就可以从本质上去修改它俩的值

总结:传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用;如果函数内部要修改主调函数中的变量的值,就需要传址调用

二 . 数组名的理解

之前我们提到过使用指针访问数组内容,我们知道了,数组名其本质就是首元素的地址,如下图:

这个时候就有小伙伴发出真挚的疑问了:讲道理,如果数组名就代表着首元素的地址,我们之前所见到的sizeof(arr)为什么是 40 而不是 4/8 呢?如下图:

这里呢就是我们的一个例外情况了哈,有关于数组名的使用有两个例外:(重点重点重点!!!)

(1)sizeof(数组名):当 sizeof ()中单独放置数组名,这里的数组名就表示整个数组,计算的是整个数组的字节大小

(2)& 数组名 :这里的数组名表示整个数组,取得是整个数组的地址(整个数组的地址与数组首元素的地址是有区别的)

&arr[0]和&arr[0]+1相差4个字节,arr 和 arr+1 相差4个字节,是因为 &arr[0] 和 arr 都是首元素的地址,+1就是跳过一个元素
&arr 和 &arr+1 相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的

 三 . 指针访问数组

关键点的解读都在代码中为诸君做了注释,我就不过多赘述了

四 . 一维数组传参的本质

不知道大家有没有注意过,我们跟数组打了那么多次交道,sizeof()我们也用过多次,但我们一直都是在函数外部计算数组的元素个数,然后再通过传参的方式将 sz (元素个数)传递给函数。那么我们可不可以通过传参过来的数组直接在函数内部计算数组中的元素个数呢?不妨一试:

可以看到我们这个输出结果并不像我们预想的那样,问题就出在我们数组的传参上

在上面第二点我们提到过,数组名的本质是首元素地址。所以函数形参的部分理论上应该是使用指针变量来接收首元素的地址,那么在函数内部,我们这个时候使用 sizeof()计算的就不是一个数组的字节大小了,而是计算的一个地址的字节大小

不管我们怎么去传参,本质都是以指针形式表现的,如图:

总结:在函数内部我们使用sizeof()计算的都是对其首元素地址的字节大小(4 或 8由编译环境决定)。所以在函数内部是没法求数组的元素个数的

五 . 二级指针

众所周知,指针变量那也是变量,是变量就有地址,我们指针本身就是指向一个地址的,那么它本身作为一个变量而言,它的地址又存放在哪里呢?

这就是我们所谓的二级指针,这文字理解起来有点绕昂,跟俄罗斯套娃一样,咱们上图理解:

如图,这段代码的含义就是:

(1)创建了一个整型变量 a 并赋值为 10

(2)取出 a 的地址存放在指针(一级指针)pa 中

(3)同理再取出 pa 的地址存放在指针(二级指针)ppa 中

总结:二级指针的本质存放的就是一级指针的地址

文字、图片的表达能力终究有限,还望诸君见谅,自己细心一层一层地捋开指针之间的嵌套关系

六 . 指针数组

指针数组?到底是指针还是数组呢?一时半会捋不清的小伙伴们不妨类比一下我们学习过的知识:整型数组——存放整型的数组;字符数组——存放字符的数组

由此观之,指针数组就是用来存放指针的数组

指针数组当中的每一个元素都是一个指针,或者说每个元素都是指向内存中一块空间的地址

(1)指针数组模拟二维数组

不知道大家可还记得二维数组,我们可以先来回顾一下

想更仔细了解的,可以点链接查看我之前的博客哦,里面较为详细的介绍了二维数组的相关知识:二维数组 和 变长数组_变长二维数组-CSDN博客

接下来我们利用指针数组来模拟实现我们的二维数组:

前面提到过:指针数组就是用来存放指针的数组,我们这里三个数组——arr1、arr2、arr3,又新创建了一个 *parr ,而在这其中,将这三个数组放进去,又因为数组名就是首元素的地址,所以这里三个数组放到 parr 中时都是属于 int* 类型的指针,看下图更好理解:

应该注意的是:以上代码只是我们运用指针数组模拟实现的二维数组,并不是真正意义上的二维数组,因为它们的每一行并非连续的

这里没有什么生冷硬的知识,都是将我们学到过的知识点串联起来就可以得出,相信以诸君的聪明才智,定能轻松拿捏!

OKK,今天有关于指针的小部分知识就跟大家聊到这里,咱们下期再见咯。与诸君共勉!!!

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

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

相关文章

JS 获取当前操作系统类型

在JavaScript中,‌直接获取用户的操作系统信息是不可能的,‌因为JavaScript主要运行在浏览器中,‌而浏览器出于安全和隐私的考虑,‌不会提供访问操作系统详细信息的API。‌ 但是,‌你可以通过分析用户代理字符串&…

数据库性能定位-慢sql定位、sql优化(docker容器实战)

安装好mysql数据之后,创建库的时候,要注意选择 字符集编码。如果没有选择好,你的库表存中文的时候,会字符集乱码。选择utf8mb4. 建表的时候,存储引擎 InnoDB、MyISAM mysql5.7及以后数据库,表的默认存储引…

官方招募 | 仓颉语言三方库社区建设全速启航,全球开发者、技术大神只等您!

Cangjie-TPC招募令 仓颉社区的小伙伴们,官方三方库(Cangjie-TPC)招募开始啦! Cangjie-TPC(https://gitcode.com/Cangjie-TPC) 是 Cangjie 社区用于汇集基于仓颉编程语言开发的开源三方库的主干仓&#xf…

JS获取当前浏览器名称

在JavaScript中,获取当前浏览器名称的方法并不是一个标准的功能,因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是,你可以通过分析用户代理字符串(User-Agent)来推断出浏览器的名称。 以下是一个简单的…

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据,一个为投影坐标系,另一个为地理坐标系时,在GIS软件中位置无法叠加到一起,这需要将两个或多个数据的坐标系统一,可以直接将地理坐标系的数据进行投影,或将投影坐标系转为地理坐标系。下面介绍…

视频号AI美女跳舞,轻松月入30000+,蓝海赛道,流量池巨大,起号猛

今天给大家分享的是一个男生比较感兴趣的内容,AI美女视频跳舞项目4.0版本,7天快速起号,实现每月30000的稳定收入. 大家刷抖音的时候,肯定都刷到过美女跳舞的视频,对吧?这种视频,不管在哪个平台…

电商项目DevOps一体化运维实战

主要讲了git和jkins的使用,其中maven的一个插件还挺好用的,主要可以用来查看哪些类没有使用,哪些导入的包是多余的等。这里展示一下用法。至于git和jkins的搭建后续再操作。 maven插件的使用: 编译后就可以在target下面看到这个h…

网络安全之XSS基础

从 XSS Payload 学习浏览器解码 xss payload 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">1</a> 2.<a href"&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:…

代码随想录:动态规划6-10

62、不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径…

基于STM32开发的智能农业环境监控系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理环境控制与状态指示Wi-Fi通信与远程监控应用场景 农业温室环境管理农田环境监控与自动化管理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着农业技术…

Codigger 视频会议(Meeting):制造业的高效协作引擎

在制造业数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。视频会议作为一种高效的沟通工具&#xff0c;在制造业中发挥着关键作用。 制造业对于视频会议有着多方面的需求与挑战。不同生产基地往往分布在各地&#xff0c;跨地域协作需求十分迫切。在技术交流时&…

stm32—ADC

1. 什么是ADC 生活中我们经常会用到ADC这种器件&#xff0c;比如说&#xff0c;当我们在使用手机进行语音通信时&#xff0c;ADC器件会将我们的声信号转换为电信号 (模拟信号 ---> 数字信号) 模拟信号&#xff1a; 模拟信号是指用连续变化的物理量表示的信息&#xff0c;其信…

【Vue3】编程式路由导航

【Vue3】编程式路由导航 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

【Qt】 常用控件QLCDNumber

常用控件QLCDNumber QLCDNumber是一个专门用来显示数字的控件&#xff0c;类似于“老式计算机”的效果。 QLCDNumber的属性 属性说明 intValue QLCDNumber 显⽰的数字值(int). value QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, i…

C语言程序设计-练习篇

山海自有归期&#xff0c;风雨自有相逢。 一 下面代码的结果是什么&#xff1f; int main() { int i 0; for (i 0; i < 10; i) { if (i 5) //此处为赋值&#xff0c;i 5表达式结果为5 printf("%d ", i); //表达式为真&a…

AI 进阶实战 | 走进大模型(LLM)+智能体(Agent)+提示词(Prompt)

前言 人工智能&#xff08;AI&#xff09;不再只是科幻电影中的桥段&#xff0c;而是正以前所未有的速度改变着我们的世界。随着大规模语言模型&#xff08;LLM&#xff09;系列的崛起&#xff0c;结合高度智能的&#xff08;Agent&#xff09;与精心设计的&#xff08;Prompt…

topic交换机

topic交换机 是什么交换机模式 这个模式可以用点分割代表不同的消息类型 例如:有4种消息,其中我想发送china相关的消息,就china.#,指多个单词 我想发送各国的天气,就可以#.weather 优势 比directexchange相比更方便些 案例 创建队列 创建交换机 绑定 绑定关系已确认

macOS安装搭建python环境

安装Homebrew apt-get是一个常见于Debian和Ubuntu等基于Linux的操作系统中的包管理工具&#xff0c;用于安装、更新和移除软件包。然而&#xff0c;macOS使用的是Homebrew或者MacPorts等其他的包管理工具&#xff0c;并不使用apt-get。 如果你想在macOS上使用类似apt-get的功…

创建、使用、删除 数据库

一、创建数据库 1.1 使用DDL语句创建数据库 CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码; 案例&#xff1a; 创建一个test 的数据库&#xff0c;并查看该数据库。 create database test default character set utf8; show databases; 1.2 使用Navicat创建数据库 …

快速排序的深入优化探讨

快排性能的关键点分析 决定快排性能的关键点是每次单趟排序后&#xff0c;key对数组的分割&#xff0c;如果每次选key基本⼆分居中&#xff0c;那么快排的递归树就是颗均匀的满⼆叉树&#xff0c;性能最佳。但是实践中虽然不可能每次都是⼆分居中&#xff0c;但是性能也还是可…