这篇文章主要为大家展示了“C/c++值传递和址传递有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/c++值传递和址传递有什么区别”这篇文章吧。
C/c++的按值传递和按地址传递有明显不同,下面对他们作个区别:
按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。
按地址传递:在调用函数的时候将原函数的值所在的地址拷贝一份过去,被调用函数对这个地址所作的修改会影响原来的值。
概述:
首先我们要知道<强> " 强> <代码>的地址代码>”和“<代码>地址中的内容> 代码”的区别,数据是存放在内存中的,每一个变量都有一个内存地址,变量的内容存放在对应内存地址的空间中
比方说定义
int a =, 10;
<强>那么一个在内存中的地址是0 x1100,在这个地址中存储的数据是10 强>
假设创建指针p,把一个的地址赋值给<代码> p> 代码,就是把一个的首地址0 x1100赋值给指针<代码> p> 代码,这个时候p的值就是变量一个在内存中的首地址
int a =10; int * p; p=,,,//把一个的首地址赋值给p
简单点的理解就好比你去图书馆借的书,每本书都会有他的一个编号(<代码>地址> 代码),记录它所在的位置,而这个书,就是这个<代码>地址对应的内容代码>,
如果你用指针,得到的是这个书所对应的编号(<代码>地址> 代码),存储内容就是地址
如果你是变量赋值,值传递,那么就相当于复印了一遍这个书(<代码>地址对应的内容> 代码),然后用一个新的编号(<代码>地址> 代码),去存储你复印的这本书
从命名来理解
所以我们就会发现:
值传递,或者变量赋值,修改变量的值,修改的是新的新的编号(<代码>地址> 代码)中的内容(复印的书),不会影响到原来编号(<代码>地址> 代码)中的数据。
也就是形参是实参内容的拷贝,并不是地址的拷贝,所以改变形参的值并不会影响实参的值
使用址传递,用指针修改变量的值,就是把原编号(<代码>地址> 代码)中的书给修改了,换了一本新的书,就相当于对实参本身进行的操作。
声明声明:描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方)
定义定义:产生一个新的对象,并分配内存。(只能出现一次)
值传递
新开辟一个内存空间,存储原来变量的值,修改变量修改的是新的内存空间中的值,所以,原始的参数不会被函数修改。
值传递的优点:通过值来传递的参数可以是数字,变量,表达式。原本参数的值不会被修改。
值传递的缺点:不能修改原参数的值。
# include & lt; stdio.h> , void swap (int x,, int y) { int 温度; x=temp ; y=x ; 时间=y 温度;//printf (“x =, % d, y =, % d \ n",, x,, y); } , int main (空白) { 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 & lt; stdio.h> void swap (int * x,, int * y) { int temp=* x; * x=y *; * y=temp;//printf (“x =, % d, y =, % d \ n",, * x,, * y); } , int 主要(空白) { int =4; int b=6; ,,,printf(“交换前:\ n a =, % d, b =, % d \ n",, a, b); swap (,,, b);,,//传递的是地址, printf(“交换后:\ n a =, % d, b =, % d \ n",, a, b); return 0; }C/c++值传递和址传递有什么区别