为了弄明白加了_ _Block之后,为什么局部变量就可以在Block内部修改了的问题,先要明白值传递,地址传递和引用传递,才能清楚问题所在。这篇文章就是为了说明白这几种传递到底是怎么回事的。
我们新建一个控制台应用程序,如下图:
![](https://img.haomeiwen.com/i1293851/b81afcbbf60a1575.png)
为了使用取地址符号,我们把main函数的后缀名改了,改成main.mm,这样编译就不会报错了。
int test1(int a); 值传递
int test2(int *a); 地址传递
int test3(int &a);引用传递
先看源码:
//
// main.c
// BlockDTest
//
// Created by wenhuanhuan on 2020/7/4.
// Copyright © 2020 weiman. All rights reserved.
//
#include <stdio.h>
int test1(int a);
int test2(int *a);
int test3(int &a);
int main(int argc, const char * argv[]) {
int num1 = 10;
printf("传递前:num1地址: %p\n", &num1);
int r1 = test1(num1);
printf("r1 = %d num1 = %d\n\n", r1, num1);
int num2 = 10;
printf("传递前:num2地址: %p\n", &num2);
int r2 = test2(&num2);
printf("r2 = %d num2 = %d\n\n", r2, num2);
int num3 = 10;
printf("传递前:num3地址: %p\n", &num3);
int r3 = test3(num3);
printf("r3 = %d num3 = %d\n\n", r3, num3);
return 0;
}
//值传递
int test1(int a) {
printf("test1 参数地址a = %p\n", &a);
a = 20;
return a;
}
//地址传递
int test2(int *a) {
printf("test2 参数地址a = %p, *a = %p\n", &a, &(*a));
*a = 20;
return *a;
}
//引用传递
int test3(int &a) {
printf("test3 参数地址a = %p\n", &a);
a = 20;
return a;
}
看看打印结果:
![](https://img.haomeiwen.com/i1293851/9081e23de8760fdd.png)
通过比较传递前后,参数与原来变量的地址,我们发现如下结果:
- 值传递:参数与原来地址不一致,参数值的更改不影响原来值。
- 地址传递:参数是传递的地址,此地址与原来值的地址一致,参数的修改会影响原来的值。
- 引用传递:参数传递的就是原来值的地址,修改地址中的值,会对原来的变量造成影响。
如果你觉得代码看起来费劲,阐述看起来费眼,好的,我们再来画张图。
![](https://img.haomeiwen.com/i1293851/0502b1fef066a581.png)
![](https://img.haomeiwen.com/i1293851/c884af8322e96d64.png)
上图中,a是一个指针,指向num2的地址。
&a和*a有什么不同呢?
*a是一个指向某个地址的指针。
&a是一个引用,引用就是指针,两者没有区别。我们可以把引用想象成一个不需要" * "就可以访问变量的指针。
![](https://img.haomeiwen.com/i1293851/4a902153d6830648.png)
引用传递,参数的地址与原来变量的地址是一样的,所以更改参数的值,变量的值也会跟着改变。
网友评论