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 自身地址不同
![](https://img-blog.csdnimg.cn/e9ed113e7050437b8fca8b9f273d080b.png)
- 引用传递(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);
}
![](https://img-blog.csdnimg.cn/784c6fe39f3f4beebbac9ee1e1dfedfb.png)
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);