指针简介(2)——参数传值和参数传址

【C语言深度剖析】重点详解函数的形参和实参、传值和传址 文章目录例题分析实参与形参修改分析传值和传址传值调用传址调用 讲解知识点之前,我们先来做一道题! 例题 写一个函数可以交换两个整形变量的内容 例如: 交换前:20 30 交换后:30 20 题目让我们用函数的方式写 #include <stdio.h> void Swap1(int x, int y) { int z = 0; z = x; x = y; y = z; } int main() { int a = 0; int b = 0; scanf("%d%d", &a 阅读详情

声明:

        本文是阅读周立功老师的程序设计与数据结构后所写,很多内容其实是书中的内容,所以如果您想了解更多这方面的知识,您可以阅读这本书。

 

        在调用函数时我们通常会向调用的函数传递参数,而这里的参数有两种方式传递进入函数,一种是将实参的变量名直接传递给调用函数,这种被称为是参数传值,而另一种是将实参的地址传递给调用函数,这种方式被称为是参数传址。

参数传值:

        参数传值相对来说使用比较多,而参数传值其实就是将调用函数中的实参的值复制给了被调函数的形参,而对于被调函数来说他并不能真正的操作调用函数中的实参。

参数传址:

        相对于传值,传址函数就可以对被调函数的实参进行操作了,因为是传址,而在程序中一个变量的地址是唯一的,当我们找到这个地址并对这个变量进行操作就会容易很多。下面我们以一个例子程序及其运行结果来说明这两者的不同。

#include <stdio.h>
#include <stdlib.h>

void changeValue(int num)
{
	num = num++;
	printf("the num = %x \n\r",num);
}

int changePoint(int *ptr1)
{
	if((ptr1=(int *)malloc(sizeof(int)))==NULL)
	{
		return -1;
	}
	printf("the ptr1'address is %p \n\r",ptr1);
	return 0;
} 

int changePoints(int **ptr1)
{
	if((*ptr1=(int *)malloc(sizeof(int)))==NULL)
	{
		return -1;
	}
	printf("the *ptr1'address is %p \n\r",*ptr1);
	return 0;
} 


int main(int argc,int **argv)
{
	int iNum = 0x54;
	int *ptr = &iNum;
    
     /* 分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum);
	
    /* 对iNum进行函数changeValue操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	changeValue(iNum);
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum); 

    /* 对ptr进行函数changePoint操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	changePoint(ptr);
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum); 

     /* 对ptr的地址进行函数changePoints操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	changePoints(&ptr);
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum);
	return 0;
}

 

下面我们分析程序及其运行结果:

1,未进行任何前指针ptr所指向的地址,变量iNum的地址以及变量iNum的值为:

int iNum = 0x54;
int *ptr = &iNum;
    
 /* 分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum);

2,changeValue函数后:

void changeValue(int num)
{
	num = num++;
	printf("the num = %x \n\r",num);
}

 /* 对iNum进行函数changeValue操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	changeValue(iNum);
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum); 

        虽然在被调函数中num的值改变了,但是在主调函数中iNum的值并没有改变。因此参数传值并不能改变实参的值。

3,对指针进行传值操作:

int changePoint(int *ptr1)
{
	if((ptr1=(int *)malloc(sizeof(int)))==NULL)
	{
		return -1;
	}
	printf("the ptr1'address is %p \n\r",ptr1);
	return 0;
} 

/* 对ptr进行函数changePoint操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
	changePoint(ptr);
	printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum); 

        我们在上面的函数中同样对指针进行了传值操作,即将指针ptr的值传递给被调函数changePoint,而并没有将指针ptr的地址传递过去,因此虽然我们申请了新的地址,但是对指针ptr进行改址操作是失败的。

4,对指针进行传址操作:

int changePoints(int **ptr1)
{
	if((*ptr1=(int *)malloc(sizeof(int)))==NULL)
	{
		return -1;
	}
	printf("the *ptr1'address is %p \n\r",*ptr1);
	return 0;
} 

/* 对ptr的地址进行函数changePoints操作后,分别打印指针ptr所指向的地址,变量iNum的地址以及变量iNum的值 */
changePoints(&ptr);
printf("the ptr = %p ,&iNum = %x ,iNum = %x \n\r",ptr,&iNum,iNum);

        这里我们将指针ptr的地址传递给被调函数,在被调函数中对指针的地址 进行操作就可以实现对调用函数实参的操作了。因此我们发现指针ptr的地址改变了。

指针变量的传值和传址 1 引言举个例子:在func函数退出后,指针pInt所指的内容*pInt为 12#include<stdio.h> //公众号:C语言与CPP编程 intfunc(int... 阅读详情

相关推荐

「Debug R」在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’...

每当R语言版本更新,Bioconductor的版本随之更替的时候,总会有一些神奇的报错会出现,比如说下面这种。 Error: package or namespace load failed for ‘GenomicRanges’: 在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’ 如果读中文读不懂,我们可以把它翻译成英文。 packa...

xuzhougeng blog 1999

【重要!】一文理解指针作为函数参数传递!看完不懂你打我

最简单易懂的指针作为函数参数传参理解!看完这篇就能永久记住!

陪着青缘一起成长 7290

Index-TTS-1.5:多模态语音合成的技术演进与商业落地实践

本文深入探讨了Index-TTS-1.5在多模态语音合成领域的技术演进与商业落地。该模型基于GPT风格的自回归Transformer架构,通过优化条件编码器和引入字符-拼音混合建模,显著提升了语音生成的稳定性、精准度和真实感,实现了高质量的零样本语音克隆。文章还详细介绍了其云端体验、本地WebUI部署及ComfyUI集成等实战路径,并分析了其在虚拟数字人、个性化内容创作等商业场景中的应用潜力与挑战。

weixin_29098367的博客 401

字符指针赋值、传值

1.先来理解一下指针的初始化及赋值 int main() { char *a; cout<<"please input the plaintext"<<endl; cin>>a; cout<<a; } a=...是给a赋值 *a=...是给a指向的内存赋值 上述代码错误在没有把一个变量的地址赋值给指针 ...

MaxineZhou的博客 7253

jmeter5.4.1 使用案例

jmeter主要用于接口压力测试,模拟海量请求并发访问接口 1.下载jmeter https://jmeter.apache.org/download_jmeter.cgi 2.启动jemter 双击即可 3.配置jmeter 1.先更改语言 2.创建线程组 配置线程执行规划 3.创建http请求默认值 4.创建http请求 5.创建http信息头管理器 指定 Content-Type:application/json 6.创建响应断言 7.创建察看结果数 直接点击 执行 按.

SpringHASh的博客 1221

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6908

指针的值传递

指针的值传递和变量的值传递一样,当参数是指针的时候,在函数内部只是对指针修改,那是没有意义的。 下面看一个例子: void GetInt(int *pInt) { pInt = new int; } void FreeInt(int *pInt) { if(pInt) delete pInt; } int main() { int *p1 = NU...

Think88666的博客 1万+

51-14 Retentive Network,RetNet 多尺度保留机制序列建模论文精读

RetNet 提出了多尺度保留机制序列建模,该机制支持三种计算范式,即并行、循环和分块循环。RetNet有更好的全局注意力建模、高效的计算效率、对遮挡的鲁棒性、支持基于注意力的图像生成、与置信度相关的门控机制和多任务学习等特点,对不同视觉任务可以共享历史注意力记忆,可以同时进行分类、分割、检测等任务。RetNet在视觉领域应该有广阔的应用前景。

AIgraphX 1613

函数传参问题(指针传参,值传参,引用传参):

c++ 函数传参问题(指针传参,值传参,引用传参)

weixin_40026739的博客 6304

node运行项目-Network: unavailable-没有ip地址

vscode运行vue项目后发现Network: unavailable 是什么情况呢?可能有一下三种情况:1.多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个2.在中配置host及public3.系统环境变量问题。

JackieDYH的博客 7539

【系统架构设计师】2026年上半年真题论文:论高并发系统的设计与实践

本文围绕高并发系统架构设计展开,重点论述了电商秒杀系统的实战经验。文章采用"痛点-解决方案-效果"的逻辑结构,从缓存设计、异步处理、限流降级、数据库优化等6个维度详细阐述了应对高并发的技术策略。其中,重点介绍了多级缓存体系、基于消息队列的异步处理机制和微服务拆分实践,并辅以实际案例说明如何解决超卖、缓存雪崩等典型问题。全文强调高并发设计需要系统性思维,通过空间换时间、异步换吞吐、横向换能力等原则,最终实现系统吞吐量从500TPS提升至20000TPS的性能突破。

数据知道的博客 1157

C语言指针值传递和地址传递

C语言传参分为值传传递和地址传递。C语言指针传参时,可以通过指针引用方式改变指针指向的值。改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式。 C语言值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参) #include <stdio.h> void swap(int x, int y); main() { int a = 10, b = 20; swap(a,

tecoes的博客 1万+

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 375

【C语言】传值调用和传址调用

交换两个值的函数,详解传值调用和传值调用的区别和应用场景。

m0_73713491的博客 5215

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C语言中函数调用中的传值与传址

首先介绍一下函数中传值与传址的概念: 传值:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。 传址: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。 用两个例子来说明: 先看看这个代码 #include void swap(int n1,int n2) {

ljx_5489464的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

传值、传址、引用的介绍及各自的优缺点

1 传值 1.1 概念 void Swap(int left, int right) { int temp = left; left = right; right = temp; } int main() { int a = 10; int b = 20; cout << a << " " << b << endl; Swap(a, b); cout << a << " " << b << end

zhao_leilei的博客 5371

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

传值与传址

首先介绍一下函数中传值与传址的概念: 传值:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。 传址: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。 下来用两个例子来说明: 先看看这个代码 #include<stdio.h> void swap(int n1,int n2) { int temp; temp=n1; n1=n2; ...

shuaifeng_的博客 2487

传值,传址,传引用(数组,对象)

传参方式

qq_45809243的博客 1537

函数的传值和传址调用(C语言)

1:传值调用。传值调用顾名思义就是将参数的值传递给函数,而函数在进行调用时会复制这个值,然后将复制的值在函数中进行调用。 void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } int main(void) { int ...

weixin_42250655的博客 1万+

理解传值与传址的区别

详细讲述在C语言中使用函数时传值调用与传址调用的区别

qjx的博客 1260

理解C++传值、传址、引用调用

使用C++很长时间,对一些最基本的知识点不求甚解,有时会犯很低级的错误,并且这些bug在调试中很难发现。以前只了解传值、传址、引用调用的区别,没有深入了解,今天稍微总结一下,今后慢慢深入。 1.传值调用 在传值调用时,实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变。通过例子来看,代码运行结果: void funcValue(int ...

u012507022的博客 3506

C++中传值、传址与传引用的区别

1、参数传递的概念  所谓参数传递就是用函数调用所给出的实参(实际参数)向函数定义所给出的形参(形式参数)设置初始值的过程。 在c++中,调用函数时有三种参数传递方式,分别为: (1)传值调用; (2)传址调用(即是传指针); (3)传引用;     总体上参数传递可以分为两类,由形参的类别决定:值调用与引用调用。除了定义为引用类型的形参外,其他类型的形参都是对应着值调用。指针传递也是

Silence723的博客 7213

python传参数是传值还是传址_Python的传值和传址与copy和deepcopy

1.传值和传址传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会改变的,用传址传入就会。a=1deff(b):b=2f(a)print a例如这段代码里面,首先声明a的值为1,把a作为参数传入到函数f里面,函数f里面对b重新赋值为2,如果是传值的形式传入a的话,a的...

weixin_35511255的博客 1269

C++中指针和引用的区别&&传值、传址、传引用的区别,哪一种高效?

一、概念 指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。 引用:引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。 举个例子: int a=10; //指针,定义了一个整型变量a和指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。 int* p=&amp;a; //引用,一个整形变量a和这个整形a的引用b,事实上a和b...

cherrydreamsover的博客 2322

c语言的传值和传址

C语言的传值和传址

芮萌萌的博客 6940

C++中传值传指针传引用的区别

当调用函数时,传递的参数有传值、传指针、传引用这三种形式。 直接传值是直接开辟了一个跟主函数实参一样的空间(地址不一样),里面存放了了跟实参一样大小的值,就相当于数值大小相同但是位置不同。你在这个调用函数里使用这个一样大小的值,完全不影响主函数实参的值。就好比主函数的空间就是一栋楼,里面的一个房间里放着一些东西(相当于实参变量值)。现在我调用了一个函数,就相当于我在另一栋楼的另一个房间里面,把刚...

James_J的博客 8735
上一篇: 指针简介(1)
下一篇: 指针简介(3)—— 指针函数与函数指针
moxue10
博客等级 码龄19年 388粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值