函数调用时的传参方式(C语言)

1.值传递

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
将已初始化的变量值(或常量)传到函数中。把实参赋给形参,形参改动不影响实参。调用函数时,实参需要先进行初始化

void passByValue(int x){ // 值传递
    printf("\n--- 值传递函数内部参数情况\n");
    x = 6;
    printf("a=%d, 地址:%p",x,&x);
}
void main(){
    printf("--- 初始参数情况\n");
    int a = 1; //, b = 2;
    printf("a=%d, 地址:%p",a,&a);
    passByValue(a);
    printf("\n--- 值传递(主调函数参数情况)\n");
    printf("a=%d, 地址:%p\n",a,&a);
}

执行结果如下:

2.指针传递(地址传递)
指针学习笔记

func(int *a){ *a = x; // 不带 *,改不了}
main(){ func(&a); } ——函数可改实参值

main函数中将变量 i 的地址传给函数 passByPointer 时,实际上相当于:j = &i; 仍然是值传递。只不过传递的是指针变量,是值传递就必须先进行初始化。

void passByPointer(int *j){
    printf("\n--- 指针传递函数内部参数情况\n");
    *j = 66;  //间接访问得到变量 i
    printf("j = %d, j的地址:%p , j 存放的内容:%p",*j,&j,j);
}
void main(){
	printf("--- 主调函数初始参数情况\n");
    int i = 6;
    printf("i = %d, 地址:%p",i,&i);
    passByPointer(&i); 
    printf("\n--- 指针传递(主调函数参数情况)\n");
    printf("i = %d, 地址:%p\n",i,&i);
}

通过 *j 间接访问到了与变量 i 相同的区域,通过*j = 66;实现了对变量 i 值的改变。 通过运行结果可发现,变量 j 自身地址与变量 i 自身地址不同

  1. 引用传递(C没有,C++特有)

在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

void passByReference(int &m){
    m = 6;
    printf("形参 m = %d 地址:%p\n",m,&m);
}
int main() {
    int n = 0;
    printf("实参 n = %d 地址:%p\n",n,&n);
    passByReference(n);
    printf("--- 主调函数 ---\n");
    printf("实参 n = %d 地址:%p\n",n,&n);
}

1、值传递改不了实参

2、指针传递:

  • 函数内 *a = x; 可更改实参 a;
  • a = x; 改不了实参 a ;
  • 传参形式如下
 fun(int *a){}     
 fun(&a);

3、传数组:

fun(int* arr){ //fun(int arr[])
arr[n] = xx;
}  
// 上面 2 种,都能更改数组元素实参
fun(arr);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俺要工作俺想工作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值