赞
踩
1.值传递和地址传递
(1)值传递:即按“值(如数字10)”传递参数,是将实参变量的值复制一个到临时存储单元中(该存储单元会随着调用的函数运行结束而释放掉),如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变
(2)地址传递:即按“地址(如0019FEDC)”传递参数,把实参变量的地址传送给被调用函数,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变
注:值传递在函数调用过程中会为形参重新开辟空间,形参与实参分别占用不同的地址空间,而地址传递,形参和实参共用同一内存地址
举栗子:
①值传递(普通类型变量的参数传递)
void fun1(int a){
a=2;
printf("在fun1函数中,变量a值的地址是:%p\n",&a);
a=a+1;
}
void main(){
int n=1;
printf("在main函数中,变量n的地址是:%p\n",&n);
fun1(n);
printf("fun1函数中形参a加1之后,实参n的值是%d\n",n);//n的值任然不变还是1
}
运行结果
②地址传递(指针作为参数)
void fun2(int *q){
printf("在fun2函数中q的值是(和m的地址,p的值一样):%p\n",q);
*q=*q+5;
}
void main(){
int m=10;
int *p=&m;
printf("在main函数中,m值的地址:%p\n",&m);
printf("在main函数中,p指针的值(p所指向变量的地址):%p\n",p);
printf("在main函数中,p指针的地址(指针变量本身也要占存储单元):%p\n",&p);
fun2(p);//传的是p的值,该值是m的地址
printf("执行fun2函数后,m的值是(由于形参和实参共用内存的同一地址,形参改变实参也改变):%d\n",m);
}
注:当 “ * ” 有两个作用 。作用一(定义指针变量):int *p; 作用二(取值):int m=10; int p=&m; printf(*p)//输出10
运行结果
③数组名的参数传递
“数组名的值”和数组的地址都存储了数组的首地址
void fun3(int arr[]){
for(int i=0;i<5;i++){
printf("%d",arr[i]);
}
}
void fun4(int *arr){
for(int i=0;i<5;i++){
printf("%d",arr[i]);
}
}
void main(){
int arr[5]={1,3,5,7,9};
int*r;
r=arr;
fun3(arr);//传数组名
printf("\n");
fun4(r);//传递指针
printf("\n");
printf("数组名的值:%p\n",arr);
printf("数组的地址值:%p\n",&arr);
}
运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。