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

news2024/11/16 13:44:36

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

目录

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

对于指针在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.coloradmin.cn/o/1517370.html

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

相关文章

PHP极简网盘系统源码 轻量级文件管理与共享系统网站源码

PHP极简网盘系统源码 轻量级文件管理与共享系统网站源码 极简网盘是一个轻量级文件管理与共享系统,支持多用户,可充当网盘程序,程序无需数据库 安装步骤: 1.建议安装在apache环境下,并确保.htaccess可用 2.解压文件…

论文阅读——RingMo

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling 与自然场景相比,RS图像存在以下困难。 1)分辨率和方位范围大:受遥感传感器的影响,图像具有多种空间分辨率。此外,与自然图像的实例通常由于重…

【Python】Leetcode 240. 搜索二维矩阵 II - 削减矩阵+递归,击败88%

描述 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。 该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路 确定左右及上下限,削减矩阵,递归。 注意判断四个端…

15届蓝桥杯第一期模拟赛所有题目解析

文章目录 🧡🧡t1_字母数🧡🧡问题描述思路代码 🧡🧡t2_大乘积🧡🧡问题描述思路代码 🧡🧡t3_星期几🧡🧡问题描述思路代码 🧡…

Spring基础——使用注解开发SpringMVC

目录 配置SpringMVC的初始化信息配置ServletWebApplicationContext配置RootWebApplicationContext配置ServletContext 创建Controller控制器配置Controller响应路径接收用户传递参数接收JSON数据接收简单类型对象封装参数 接收数组类型 Restful 文章源码仓库:Spring…

大模型笔记:吴恩达 ChatGPT Prompt Engineering for Developers(1) prompt的基本原则和策略

1 intro 基础大模型 VS 用指令tune 过的大模型 基础大模型 只会对prompt的文本进行续写 所以当你向模型发问的时候,它往往会像复读机一样续写几个问题这是因为在它见过的语料库文本(通常大多来自互联网)中,通常会连续列举出N个问…

Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】

Flask vs. Django:选择适合你的Web开发框架 在选择一个适合你项目的Web开发框架时,常常会遇到 Flask 和 Django 这两个流行的选择。两者都有其优势和适用场景,本文将探讨它们的特点,并通过代码实例和解析来帮助你更好地做出选择。…

环形链表的起点——细节讲解

对于一个环形链表,我们要找到他的起点。可以通过如下推导。 我们设置两个快慢指针,相遇的点为X. 到起点的距离是T,圈长是C,第一次相交的点是X (TX)2TNCX 化出来TN*C-X 也就是说我们把一个节点放头部重新遍…

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(五) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(七) 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…

手机安装Kali Linux

在数字化时代,信息安全和隐私保护显得尤为重要。Kali Linux,作为一款专业的渗透测试和安全审计工具,因其强大的功能和丰富的资源库而受到广大安全研究者和爱好者的青睐。然而,我们通常只能在传统的电脑设备上安装和使用Kali Linux…

外卖小程序-购物车模块表结构设计和后端代码

表结构设计 添加购物车代码 Service public class ShoppingCartServiceImpl implements ShoppingCartService {Autowiredprivate ShoppingCartMapper shoppingCartMapper;Autowiredprivate DishMapper dishMapper;Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物…

在Linux/Ubuntu/Debian中使用7z压缩和解压文件

要在 Ubuntu 上使用 7-Zip 创建 7z 存档文件,你可以使用“7z”命令行工具。 操作方法如下: 安装 p7zip: 如果你尚未在 Ubuntu 系统上安装 p7zip(7-Zip 的命令行版本),你可以使用以下命令安装它:…

某夕夕商品数据抓取逆向之webpack扣取

逆向网址 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbQ 逆向链接 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2JveXNoaXJ0 逆向接口 aHR0cHM6Ly9hcGl2Mi5waW5kdW9kdW8uY29tL2FwaS9naW5kZXgvdGYvcXVlcnlfdGZfZ29vZHNfaW5mbw 逆向过程 请求方式:GET 参数构成 【anti_content】…

PHP中的反序列化漏洞

PHP中的反序列化漏洞 目录 PHP 中的序列化与反序列化 概述 序列化 基本类型的序列化 对象的序列化 反序列化 示例序列化与反序列化 反序列化漏洞 - PHP 中的魔术方法 - Typecho_v1.0 中的反序列化漏洞 POP链的构造思路 pop链案例 反序列化逃逸 字符串逃逸&#xff…

GoLang:云原生时代致力于构建高性能服务器的后端语言

Go语言的介绍 概念 Golang(也被称为Go)是一种编程语言,由Google于2007年开始设计和开发,并于2009年首次公开发布。Golang是一种静态类型、编译型的语言,旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编…

C# wpf 使用GDI实现截屏

wpf截屏系列 第一章 使用GDI实现截屏(本章) 第二章 使用GDI实现截屏 第三章 使用DockPanel制作截屏框 第四章 实现截屏框热键截屏 第五章 实现截屏框实时截屏 第六章 使用ffmpeg命令行实现录屏 文章目录 wpf截屏系列前言一、导入gdi32方法一、NuGet获取…

【LeetCode: 102. 二叉树的层序遍历 + bfs】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

国产化三防笔记本丨亿道国产加固笔记本FT-2000/4处理器

国产化加固笔记本是指采用国产操作系统和处理器,通过技术手段对其进行硬件加固、软件加密、数据安全等多方面加强处理的产品。这种笔记本电脑通常被用于政府项目、金融行业等对安全性要求极高的领域。 在国产化加固笔记本中,硬件加固是重要的一环。为了保…

架构实战--以海量存储系统讲解热门话题:分布式概念

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自…

腾讯云轻量服务器地域选择教程,2024最新地域选择攻略

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…