复习值传递,地址传递和引用传递

为了弄明白加了_ _Block之后,为什么局部变量就可以在Block内部修改了的问题,先要明白值传递,地址传递和引用传递,才能清楚问题所在。这篇文章就是为了说明白这几种传递到底是怎么回事的。
我们新建一个控制台应用程序,如下图:


image.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;
}

看看打印结果:


image.png

通过比较传递前后,参数与原来变量的地址,我们发现如下结果:

  • 值传递:参数与原来地址不一致,参数值的更改不影响原来值。
  • 地址传递:参数是传递的地址,此地址与原来值的地址一致,参数的修改会影响原来的值。
  • 引用传递:参数传递的就是原来值的地址,修改地址中的值,会对原来的变量造成影响。

如果你觉得代码看起来费劲,阐述看起来费眼,好的,我们再来画张图。


image.png
image.png

上图中,a是一个指针,指向num2的地址。

&a和*a有什么不同呢?
*a是一个指向某个地址的指针。
&a是一个引用,引用就是指针,两者没有区别。我们可以把引用想象成一个不需要" * "就可以访问变量的指针。

image.png

引用传递,参数的地址与原来变量的地址是一样的,所以更改参数的值,变量的值也会跟着改变。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容