千家信息网

C/C++值传递和址传递有什么区别

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"C/C++值传递和址传递有什么区别",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C/C++值传递和址传递有什么区别"这篇文章吧。
千家信息网最后更新 2026年11月01日C/C++值传递和址传递有什么区别

这篇文章主要为大家展示了"C/C++值传递和址传递有什么区别",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C/C++值传递和址传递有什么区别"这篇文章吧。

C/C++的按值传递和按地址传递有明显不同,下面对他们作个区别:

按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。

按地址传递:在调用函数的时候将原函数的值所在的地址拷贝一份过去,被调用函数对这个地址所作的修改会影响原来的值。

概述:

首先我们要知道 "a的地址"和"a地址中的内容"的区别,数据是存放在内存中的,每一个变量都有一个内存地址, 变量的内容存放在对应内存地址的空间中

比方说定义

int a = 10;

那么a在内存中的地址是0x1100,在这个地址中存储的数据是10

假设创建指针p,把a的地址赋值给p,就是把a的首地址0x1100赋值给指针p,这个时候p的值就是变量a在内存中的首地址

int a =10;int*p;p=&a; //把a的首地址赋值给P

简单点的理解就好比你去图书馆借书,每本书都会有他的一个编号(地址),记录它所在的位置,而这个书,就是这个地址对应的内容,
如果你用指针,得到的是这个书所对应的编号(地址) ,存储内容就是地址
如果你是变量赋值,值传递,那么就相当于复印了一遍这个书(地址对应的内容),然后用一个新的编号(地址),去存储你复印的这本书

从命名来理解

所以我们就会发现:

值传递,或者变量赋值,修改变量的值,修改的是新的新的编号(地址)中的内容(复印的书),不会影响到原来编号(地址)中的数据。

也就是形参是实参内容的拷贝,并不是地址的拷贝,所以改变形参的值并不会影响实参的值

使用址传递,用指针修改变量的值,就是把原编号(地址)中的书给修改了,换了一本新的书,就相当于对实参本身进行的操作。

声明Declaration:描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方)

定义Definition:产生一个新的对象,并分配内存。(只能出现一次)

值传递

新开辟一个内存空间,存储原来变量的值,修改变量修改的是新的内存空间中的值。所以,原始的参数不会被函数修改。

值传递的优点: 通过值来传递的参数可以是数字,变量,表达式。原本参数的值不会被修改。

值传递的缺点: 不能修改原参数的值。

#include  void swap (int x, int y){        int temp;        temp = x;        x = y;        y = temp;//      printf ("x = %d, y = %d\n", x, y);} int main (void){        int a = 4, b = 6;        printf ("交换前:\n a = %d, b = %d\n", a, b);        swap (a, b);        printf ("交换后:\n a = %d, b = %d\n", a, b);        return 0;}

输出:

址传递

址传递就是指针传递,形参实际是指向实参地址的指针,当对形参的进行操作时,就相当于对实参本身进行的操作,可以改变指针指向内容的值,但是不能改变指针本身的地址。

#include void swap (int *x, int *y){        int temp=*x;        *x=*y;        *y=temp;        //printf("x = %d, y = %d\n", *x, *y);} int main(void){        int a=4;        int b=6;    printf("交换前:\n a = %d, b = %d\n", a, b);        swap (&a,&b);  //传递的是地址         printf("交换后:\n a = %d, b = %d\n", a, b);        return 0;}

在你了解了什么是值传递和址传递之后,我们来看一个面试题:

#include #include #include void GetMemory( char *p ) {        p = (char *) malloc( 100 );}int main (void) {        char *str = NULL;        GetMemory( str );        strcpy( str, "hello world" );        printf( str );        return 0;}

请问运行会有什么样的结果? 会输出hello world吗?

答:程序崩溃,没有输出

因为 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, "hello world");将使程序崩溃
函数中的p其实是实参str的一份拷贝,函数中的操作都是对q进行的,str仍然是NULL,所以输出*str的值产生崩溃

也就是:传递给形参的指针仍然是实参指针的一份拷贝

这一点需要注意

解决的话可以把形参改为二重指针,程序便可以按预想中的情形进行:

二重指针指向一重指针的地址 也就是传递过来的实际是*str的参数本身

#include #include #include void GetMemory( char **p ) {        *p = (char *) malloc( 100 );}int main (void) {                char *str = NULL;        GetMemory(&str);        strcpy( str, "hello world" );        printf( str );        return 0;}

以上是"C/C++值传递和址传递有什么区别"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

地址 指针 函数 内容 内存 变量 就是 拷贝 形参 参数 存储 影响 输出 也就是 指向 数据 程序 空间 篇文章 复印 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技活动banner 互联网和科技技术 金融科技 互联网金融 高科技与互联网 互联网科技革命 奇酷互联网络科技 朗涯互联网科技 安控科技rtu产品工业互联网 博兴的互联网电子科技公司 湖北码尼互联网科技有限公司电话 中国航天科技大学国际工业互联网 世界互联网领先科技成果获奖 科技赋能视角下互联网保险发展 从那以后互联网科技有限公司 郑州欣桑互联网科技有限公司 易企秀互联网科技是做什么的 兰石爱特工业互联网科技分公司 互联网科技博主张洲 10位科技互联网大佬 青岛互联网科技园 山东特亿宝互联网科技有限公司 互联网的科技 科技互联网公司装修 金融科技和互联网金融 互联网科技有哪些公司 湖南一路畅行互联网科技 佛山市拉法互联网科技有限公司 世界互联网领先科技成果获奖 杭州披云加互联网科技有限公司 互联网企业和网络科技有限公司
0