解析CC++值传递和址传递的区别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解析CC++值传递和址传递的区别
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
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++值传递和址传递的区别的⽂章就介绍到这了,更多相关C/C++值传递和址传递内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。