【C语言】值传递和地址传递

值传递 引用传递(传地址,传引用)的区别

传值,是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值
传地址,是传值的一种特殊方式,只是他传递的是地址,不是普通的如int,那么传地址以后,实参和行参都指向同一个对象
传引用,真正的以地址的方式传递参数, 传递以后,行参和实参都是同一个对象,只是他们名字不同而已,对行参的修改将影响实参的值。

从函数调用的角度比较容易理解:

  • 函数的名字就是函数的首地址,就是函数的入口,例子:
void fun(void)
{}

请添加图片描述
既然 fun 是地址值,那么 fun 是什么类型? 指针类型,因为它的本质是一个地址。
void ( *)(void) —> void fun(void)

     int fun2(short s, int i){return 0;}int (*)(short, int) //fun2的类型函数调用: fun2(10,20);int (*p)(short, int)  = fun2; 

将 fun2 赋值给其他值:p = fun2,因为fun2的本质是一个地址,所以接收类型应该是:int (*)(short,int) p = fun2; <— 然而,并没有这样的写法。这里有一个规律,如果你看见 (*) 单独存在,要将后面的东西放入到 *的后面,即 写法为: int ( *p)(short, int) = fun2;
因为将fun2的值赋值给了 p,所以下面两种调用是一致的:

    p(10,20); // fun2(10,20);
  • 形参
	void fun(short s, int *p){}short a = 10;int b = 20;fun(a, &b);
    值传递 : 将变量的值,直接传给形参 // 比如 a 址传递 : 将变量的地址,传给形参   // 比如 &b 
  	void fun(int x, int *p){}int a = 10;int b = 20;int *xp = &b;fun(a, xp);  // xp 是一个 值传递 而相对于 b 来说,这才是一个址传递

请添加图片描述

#include <stdio.h>int fun(int x, int y);
int main(void)
{int a = 10, b = 20;fun(a, b); //调用fun函数 --> 在内存中给 fun 函数开辟空间printf("%d %d\n", a, b); //a,b 没有变化,因为CPU的寄存器中,fun值传递后,内存被释放,a,b的值不变fun2(&a); // 址传递,获取到了a空间中存储的值,在内存中开辟fun2 空间,p 指针类型(32位 4个字节/64位 8个字节)printf("a:%d b:%d\n", a, b); // 300 20  // *&x ---> x return 0;
}int fun(int x, int y)
{x = 100;y = 200;return x+y;
}void fun2(int *p)
{*p = 300; //地址传递,指针 p 解引用可以获取到这个指针指向的对应的空间,它可以改变函数外面的某一个变量 传递结束后,fun2 被释放
}    
//因此 scanf("%d",&a); 函数中的传参是取地址传递,与上述 fun2 同理,因为值传递内存释放后原有的数值不发生改变 而地址传递会获取到“房间”中的值,并改变这个地址中存储的内容

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

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

相关文章

摘要与登记

10.15:mysql 10.16:redis, 10.17:k8s,netty,dubbo,设计模式 10.18:juc、 10.21:rabbitMQ、ElasticSearch 10.22:docker 10.23:k8s 10.24:springsecurity 10.30:spring事务 11.01:mysql 11.05:redis 11.06:k8s 11.07:netty、docker 11.08:设计模式 11.09:juc 11.11:rabbitMQ、sp…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…

贪吃蛇小游戏设计

贪吃蛇小游戏 1.引言1.1 背景1.2 目的1.3 意义1.4 任务1.5 技术可行性分析1.5.1执行平台1.5.2 语言特性与功能方面 2.需求分析2.1 环境需求2.2开发环境分析2.3游戏功能分析2.4 游戏性能分析2.5 数据流图2.6 数据字典 3.概要设计3.1 设计思路3.2 游戏界面设计3.3 总设计模块的划…

go T 泛型

目录 1、类型约束 2、泛型函数 3、泛型结构体 4、泛型接口 5、以接口作为类型约束 关键词&#xff1a;泛型、类型参数、类型约束 Go 语言在 1.18 版本引入了泛型&#xff08;Generics&#xff09;特性&#xff0c;可以编写更通用、可复用的代码&#xff0c;泛型可以用于&a…

如何处理 iOS 客户端内 Webview H5 中后台播放的音视频问题

目录 问题描述Page Visibility API 的应用什么是 Page Visibility API&#xff1f;使用 Page Visibility API 暂停音视频完整解决方案1. 监听媒体的播放和暂停事件2. 防止自动播放3. 结合 Intersection Observer 进行媒体控制4. 手动处理应用生命周期中的事件 问题描述 在 iOS…

Matplotlib库中show()函数的用法

在Matplotlib库中使用show()函数是用于显示绘制的图形的函数。它将图形显示在屏幕上或保存到文件中。show()函数通常在绘制完图形后调用。 Matplotlib是一个用于绘制2D图形的Python库&#xff0c;它提供了丰富的绘图工具和函数&#xff0c;可以用于创建各种类型的图表&#xf…

DNS面临的4大类共计11小类安全风险及防御措施

DNS在设计之初&#xff0c;并未考虑网络安全限制&#xff0c;导致了许多问题。DNS安全扩展(DNSSEC)协议的开发旨在解决DNS的安全漏洞&#xff0c;但其部署并不广泛&#xff0c;DNS仍面临各种攻击。接下来我们一起看下DNS都存在哪些安全攻击及缓解措施&#xff0c;旨在对DNS安全…

蓝队知识浅谈(中)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;蓝队基础之网络七层杀伤链_哔哩哔哩_bilibili 本文主要分享一些蓝队相关的知识。 一、网络杀伤链 网络杀伤链&#xff08;Cyber Kill Chain&…

vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结

在 Vue 2 中&#xff0c;如果你想通过 ref 调用一个方法&#xff08;如 inputFocus&#xff09;来聚焦一个输入框&#xff0c;确保以下几点&#xff1a; 确保 ref 的设置正确&#xff1a;你需要确保在模板中正确设置了 ref&#xff0c;并且它指向了你想要操作的组件或 DOM 元素…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…

Jmeter中的定时器(一)

定时器 1--固定定时器 功能特点 固定延迟&#xff1a;在每个请求之间添加固定的延迟时间。精确控制&#xff1a;可以精确控制请求的发送频率。简单易用&#xff1a;配置简单&#xff0c;易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求或线程组。选…

网络基础协议理论(DNS协议)

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议是互联网的一项核心应用层协议&#xff0c;以下是对DNS协议的详细简述&#xff1a; 一、DNS协议的基本功能 DNS协议的主要功能是将人类易读的域名&#xff08;如www.example.com&#xff09;转换成计算…

Webkit 滚动条样式属性

Webkit 滚动条样式属性 ::-webkit-scrollbar – 整个滚动条 ::-webkit-scrollbar-track – 滚动条的滚动区域&#xff08;轨道&#xff09; ::-webkit-scrollbar-thumb – 滚动条的可拖拽部分&#xff08;滑块&#xff09; 以下是可用但不常用的属性&#xff1a; ::-webkit…

区块链技术在慈善捐赠中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 引言 区块链技术概述 定义与原理 发…

[数组二分查找] 0074. 搜索二维矩阵

文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 2. 题目大意 描述&#xff1a;给定一个 mn 大小的有序二维矩阵 matrix。矩阵中每行元素从左到右升序排列&#xff0c;每列元素从上到下…

父组件给子组件明明传的是字符串,为什么总是报错说传的是对象呢?原因如下:

// 接收父组件传过来的信息&#xff08;评论内容&#xff09; props: { item: { type: Object, //item为对象类型 item.user_id[0]._idthis.dengluzheID default () { return { } } …

使用 Python 脚本在 Ansys Mechanical 中创建用于后处理的螺栓工具

介绍 由螺栓连接定义的接头在工业应用中非常普遍。在 Ansys Mechanical FEA 中分析它们是一种非常常见的做法。通过Object Generator或Bolt Tools Add-on&#xff0c;使用线体、梁连接甚至3D实体中的梁单元&#xff0c;在Ansys Mechanical中生成螺栓连接非常容易。定义螺栓联接…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用

一、引言 随着科技的迅猛发展&#xff0c;声音克隆技术已经成为一个炙手可热的研究领域。SoVITS&#xff08;Sound Voice Intelligent Transfer System&#xff09;&#xff0c;作为该领域的先锋&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;正在为多个行业带来前所…

python调用MySql详细步骤

一、下载MySql MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/windows/installer/8.0.html点击上面链接&#xff0c;进入MySQL8.0的下载页面&#xff0c;选择离线安装包下载。 不需要登陆&#xff0c;直接点击下方的 No thanks,just start my download. …