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

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

目录

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

对于指针在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);

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

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

感谢观看!!!!!

 最后附上两道指针题:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四百零二回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的…

【C++ 学习】程序内存分布

文章目录 1. C 内存分布的引入 1. C 内存分布的引入 ① 栈又叫堆栈:非静态局部变量/函数参数/返回值等等,栈是向下增长的。 ② 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存…

Day16 面向对象进阶——接Day15

Day16 面向对象进阶——接Day15 文章目录 Day16 面向对象进阶——接Day15一、抽象类及抽象方法二、接口三、多态四、对象转型五、内部类 一、抽象类及抽象方法 //抽象类 public abstract class 类名{//抽象方法public abstract void method(); }1、抽象方法交给非抽象的子类去…

Selenium 学习(0.20)——软件测试之单元测试

我又(浪完)回来了…… 很久没有学习了,今天忙完终于想起来学习了。没有学习的这段时间,主要是请了两个事假(5工作日和10工作日)放了个年假(13天),然后就到现在了。 看了下…

Python 界面逻辑分离示例

本示例使用的发卡设备:https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.6cc85700Robi3x 一、Python 安装PyQt5,运行 Qt Designer 新建窗体文件,在窗体中拖放控件 完成界面设计,保存为…

slowfast network

SlowFast Networks for Video Recognition_slowfast networks for video recognition 复现过程-CSDN博客https://blog.csdn.net/karen17/article/details/95936983?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171041325416800184121120%2522%252C%2522scm%2522%…

AJAX 04 回调函数地狱和 Promise 链式调用、async 和 await、事件循环

AJAX 学习 AJAX 04 进阶01 同步代码和异步代码02 回调函数地狱和 Promise 链式调用(1) 回调函数地狱(2) Promise 链式调用(3) Promise 链式应用 03 async 和 await(1) async 和 await 使用(2) async函数和await捕获错误 04 事件循环-EventLoop(1) 事件循环(2) 事件循环练习(3) …

八数码(C++)

原题在这里P1379 八数码难题 思路: 本题的思路很有意思,首先我们知道0是可以和上下左右交换位置的(前提是不出边界) 不难看出我们可以把这个二维数组给转化为一个相对应的字符串来表示当前的状态,每进行一次&#xff…

Siamese Network(孪生神经网络)详解

Siamese和Chinese有点像。Siam是古时候泰国的称呼,中文译作暹罗。Siamese也就是“暹罗”人或“泰国”人。Siamese在英语中是“孪生”、“连体”的意思,这是为什么呢?十九世纪泰国出生了一对连体婴儿,当时的医学技术无法使两人分离…

Python二级备考

考试大纲如下: 基本要求 考试内容 考试方式 比较希望能直接刷题,因为不懂的比较多可能会看视频。 基础操作刷题: 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…

代码随想录训练营Day23:● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

669. 修剪二叉搜索树 题目链接 https://leetcode.cn/problems/trim-a-binary-search-tree/description/ 题目描述 思路 public TreeNode trimBST(TreeNode root, int low, int high) {if(rootnull) return null;//当前节点的值比区间的最小值小,说明需要删除&am…

goctl-swagger 生成json接口文件

参考: GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境,不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

Linux操作系统——常见指令(1)

今天分享一下Linux操作系统常见一些指令。今天介绍 ls pwd cd touch mkdir rmdir rm这几个指令。 ls指令 语法 ls 选项 目录或者文件 功能 对于目录,该命令列出该目录下的所有子目录和文件,对于文件,将列出文件名以及其他信息。 我们常用…

JavaScript基础(超详细)

目录 1.JavaScript概述 2.JavaScript的组成及其基本结构 1.JavaScript的组成 1.ECMAScript ECMAScript是一种由Ecma国际[前向为欧洲计算机制造商协会(European Computer Manufacturers Associaiton)]通过ECMA-262标准化的脚本程序设计语言。其主要描述了JavaScript的语法…

视频素材哪里去找?分享五个高清素材网站

从事短视频以来,关于视频素材哪里去找?好多人都是无从下手,今天我把使用多年的视频素材网站,分享给大家。 无论你短视频你想在抖音还是自媒体或者小红书还是搞笑摄影还是视频素材剪辑,你想要的通通都有! 蛙…

交换机/路由器的存储介质-华为

交换机/路由器的存储介质-华为 本文主要介绍网络设备的存储介质组成。 SDRAM(同步动态随机存取内存) 系统运行内存,相当于电脑的内存; NVRAM(Non-Volatile Random Access Memory,非易失性随机访问存储器…

L1-5 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。每个人可以看到别人头上的帽子,但是看不到自己的。游戏开始后,每个人可以猜自己头上的帽子是什么颜色,或者可以弃权不猜。如果没有…

网络编程:网络编程基础

一、网络发展 1.TCP/IP两个协议阶段 TCP/IP协议已分成了两个不同的协议: 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行2互联的互联网协议IP 2.网络体系结构 OSI体系口诀:物链网输会示用 2.1网络体系结构概念 每一层都有自己独…

基于HarmonyOS ArkTS中秋国庆祝福程序、以代码之名,写阖家团圆祝福

中秋、国庆双节将至,作为程序员,以代码之名,表达对于阖家团圆的祝福。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Image、Swiper等组件来实现节日祝福轮播程序。 规则要求具体要求如下: 1、根据主题,用…

XIAO ESP32S3部署Edge Impulse模型

在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。 添加进Arduino库 有两种方法将下载的文件添加进Arduino库。 在Arduino IDE程序中,转到项目选项卡…