美文网首页程序员
复习值传递,地址传递和引用传递

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

作者: 小曼blog | 来源:发表于2020-07-04 17:04 被阅读0次

为了弄明白加了_ _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

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

相关文章

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

    为了弄明白加了_ _Block之后,为什么局部变量就可以在Block内部修改了的问题,先要明白值传递,地址传递和引...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • Go语言学习笔记1 2020-11-17

    两种传递方式 1.值传递2.引用传递值传递是值拷贝,引用传递是地址拷贝,地址拷贝效率高,值拷贝数据越大效率越低。 ...

  • Java值传递

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值...

  • Java所有参数-对象引用及基本类型值--都是值传递

    前言 当前主要存在两种传递方式,值传递和引用传递,先简单介绍值传递和引用传递值传递(pass by value)是...

  • 快速区别值传递和引用传递

    复习Java知识的时候又看到值传递和引用传递的区别,然后就查询一下,结果都是Java到底是值传递还是引用传递之争,...

  • Day12-Java

    值传递和引用传递 值传递是值的拷贝, 引用传递是引用的拷贝 String 类型是引用类型, new String ...

  • python语言那些...

    值传递还是引用传递引用传递,只是在遇到传递不可变对象时像值传递。对于不可变对象的函数传参,依然是传的引用(地址)。...

  • 函数参数传递中值传递、地址传递、引用传递的区别?

    函数参数传递中值传递、地址传递、引用传递的区别?1.值传递:形参拷贝实参的值,有内存分配和释放;不会改变原始值2....

  • c++重要的概念部分

    1. const 修饰指针 2.指针和数组 3.值传递和地址传递(相当于java的引用传递) 值传递:特点 不改...

网友评论

    本文标题:复习值传递,地址传递和引用传递

    本文链接:https://www.haomeiwen.com/subject/fepuqktx.html