指针的函数传参的详细讲解(超详细)

 如果对指针基础知识已经有可以直接跳到 函数的指针传参与解引用,哪里不明白可以评论,随时解答。

目录

所以就有了一句话:指针就是地址,地址就是指针

对于指针在C语言中,指针类型就是数据类型,是给编译器看的,也就是说,指针类型与数组、int、char这种类型是平级的,是同一类的。

 指针的简单使用

 &a;就是取出a的地址

 解引用

 如何拆解指针类型

 我们看到p的类型是 int* ,我们该如何理解指针的类型呢?

 指针的大小

 补充

 函数的指针传参与解引用

那么效果就是将代码根本跑不了

wow, 为什么要用一级指针接收,还要返回一级指针????

内容便是以上,如果哪里有问题,可以评论,随时回复

感谢观看!!!!!


地址就好比一栋楼上的每层楼的房间编号,有了房间编号就容易去找到对应的房间,不需要挨个对应查找;

如果把上⾯的例⼦对照到计算机中,⼜是怎么样呢?

我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的 数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何 ⾼效的管理呢?

其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节;

其中每个内存单元就好比一个学生宿舍,一个字节空间里有8个比特位,比如一个宿舍就是一个字节单位,而8个学生每一个就是一个比特位,

每个字节单元都有对应的序号,也就比如每个宿舍都有对应的宿舍号,在计算机中我们 把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。

所以就有了一句话:指针就是地址,地址就是指针

 这句话要说他对,他也对,要说错,也有点问题;

对于指针在C语言中,指针类型就是数据类型,是给编译器看的,也就是说,指针类型与数组、int、char这种类型是平级的,是同一类的。

所以每个指针他自己就有自己的地址,而其该指针在内存中存的便是他指向的内容地址;

所以指针就是地址;但其类型不是地址,是数据类型;

 指针的简单使用

int main()
{int a = 1;int* p = &a;return 0;
}

 &a;就是取出a的地址

 在内存中其存的内容便是

 解引用

解引用简单来说,就是指针通过地址找到该指针指向的内存空间,进行访问与修改;

 看以下代码,便是解引用的使用

 如何拆解指针类型

 我们看到p的类型是 int* ,我们该如何理解指针的类型呢?

 这⾥p左边写的是 int* , * 是在说明p是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int) 类型的对象。

同理还有char*类型的指针,double*的..... 

 指针的大小

 前⾯的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后 是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。 如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要 8个字节的空间,指针变量的⼤⼩就是8个字节。

 

 补充

对于指针,还有void* 的还有用const修饰,指针+整数,野指针,assert断言,字符指针,字符指针常量,这里不在多赘述

感兴趣的可以去了解,在网上搜一下就出来了。 

 函数的指针传参与解引用

 这里将会详细讲解 函数的指针传参与解引用问题

 我们学c语言遇见过最多的库函数便是scanf与printf,那么你真的了解他吗?

对于scanf我们都知道,对应的数后面要填地址,那么我们又知道(除了特殊条件下)数组名表示首元素地址,那我们是不是可以用函数名来单独接收第一个元素呢?

那么看一下代码

 我们理解是正确的,那么再看以下代码

int main()
{int a = 10;int* p = &a;int* ps = p;*ps = 50;return 0;
}

请问运行完后的代码会有什么效果???

A: a会变为50                                B: p存的地址会变    

C: a不会变化还为10                     D:没有任何效果

 首先这段代码没有任何问题

 选什么呢?

其实会将a变为50;

为什么呢?其原因就是我们先将&a赋给int* p那么p这个指针里面的内容就会存着a的地址

又将p的内容赋给ps指针,那么对ps指针进行解引用自然就会修改a的值

问题又回来了,如果将ps变为二级指针呢?别的不改

那么效果就是将代码根本跑不了

 原因就是

在给定的代码中,存在类型不匹配的错误。错误出现在将变量'a'的地址赋给指向指针的指针'ps'时,应该使用'&'符号获取指针'p'的地址。

在原始代码中,将整数指针'p'赋值给指向指针的指针'ps'是不正确的,因为'ps'应该指向一个指针,而不是一个整数。

通过更正代码中的错误,我们可以确保指向指针的指针'ps'指向指针'p',然后通过双重指针'ps'来修改变量'a'的值。

 了解了这些我们知道需要加一个&

int main()
{int a = 10;int* p = &a;int** ps = &p;*ps = 50;return 0;
}

效果会产生什么?

 更上面同样道理,但是ps是一个指向指针的指针,那么对其解引用就会修改p的内容,改变其指向的内容

16位的50就是32 

 

 理解了这些,我们在讲以下链表哪里的指针内容

typedef int SLDataType;typedef struct SLList
{SLDataType x;struct SLList* next;
}SL;int main()
{SL* SLList=NULL;SLPushFront(&SLList, 5);return 0;
}

我们要想进行修改指针指向的内容,我们就需要传地址,那么我们是要修改指针的内容,就需要进行用二级指针接收,   SL**接收

这一点很好理解,那么我们看以下力扣上链表的函数

wow, 为什么要用一级指针接收,还要返回一级指针????

一开始我也思考了很久,后来慢慢就理解了,其基本原理就是 上面举的第二个例子,因为他这个函数传的不是地址而是

SLPushFront(SLList, 5);

传的是其值,但其他本身就又是一个指针,其本身就存着别人的地址,归根揭底还是传的是地址,所以用一级指针接收,进行解引用,同样可以改变指针指向的内存,

内容便是以上,如果哪里有问题,可以评论,随时回复

感谢观看!!!!!

 最后附上两道指针题:

大家看一下,这是什么??? 

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

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

相关文章

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备,主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作:防火墙配置若干条防火墙规则,当IP包到来,防火墙根据包的五元组属性(协…

大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现。LangChain是一个强大的开发框架,专门用于构建基于大型语言模型(LLM)的应用程序。它提供了丰富的工具和组件,帮助开发者更轻松地利用LLM的能力。下面…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

汽车电子零部件(1):综述

汽车零部件有哪些? 这里有一份汽车零部件清单,它们是汽车制造的部件,包括油车和电车;并不详尽。这些零件中的许多(并非全部)也用于卡车和公共汽车等其他机动车辆。 <

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git提交代码进入coding

安装Git后建一个文件在文件里右键点击Git Bash使用命令配置用户名和邮箱git config --global user.name "你的用户名"和git config --global user.email "你的邮箱"命令git init来初始化&#xff0c;自动将当前仓库设置为master创建一个项目&#xff08;一…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

NO9 蓝桥杯单片机之串口通信的使用

1 基本概念 简单来说&#xff0c;串口通信是一种按位&#xff08;bit&#xff09;传输数据的通信方式。 其他一些知识就直接贴图吧&#xff08;单工&#xff0c;半双工这些学过通信的同学应该都知道&#xff0c;可以上网查询一下具体概念。&#xff09; 来源还是&#xff1a;…

派对游戏2024年新局面:二超多强,市场细分

2023年末&#xff0c;《元梦之星》上线迎战《蛋仔派对》&#xff0c;网腾大战打响。 这场战役从开局就进入到了白热化&#xff0c;双方投入真金白银来拉拢玩家&#xff0c;于春节这一亲朋相聚最适合派对游戏的时段集中发力&#xff0c;互有胜负。 目前《元梦之星》略处下风&a…

打开链接跳转的模式

摘要&#xff1a; 今天遇到一个需求&#xff1a;后台小程序的域名下打开微信客服链接的&#xff01;但是小程序的域名拒绝任何第三方域名&#xff0c;跨域了&#xff01;为了上线这微信客服的功能&#xff0c;打开新页签&#xff0c;脱离小程序的域名实现微信客服链接的跳转启动…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…