值传递

作者: 罗蓁蓁 | 来源:发表于2020-04-28 19:29 被阅读0次

在函数调用那一篇里已经揭开了值传递的真相:

实参、形参有各自的存储空间(实参也可能只是一个值,而没有存储空间),实参 -> 形参是个值拷贝的过程,在函数调用前完成了这个拷贝过程,此后如果函数中对形参进行修改,实参的值不会跟着变。

但并不是我们就没办法在函数中修改外部变量了,用指针就好了,我们不需要修改指针的值,而只是修改指针指向的内存块:

0重指针(基本类型、结构体)

int add(int a, int b)
{
    return a + b;
}

只有这种参数的函数,只需要参数的值,进行计算后返回结果,不需要修改外部变量。

1重指针

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

使用场景:

int a=1, b=2;
swap(&a, &b);

函数中使用 1 重指针一般出于两种目的:

  1. 函数中要修改外部 基本类型 或 结构体 的值。
  2. 为了节省参数空间。假设函数想要读一个外部的占用空间很大的结构体变量,比如有 4KB 大小,虽然根本没想改它,但是如果用指针接收它的地址,参数只占 4 字节;如果用结构体作为参数,参数要占 4KB 的内存,而且还要进行值拷贝! 用 char* 来接收字符串也可以看做是出于节省空间的目的。

2重指针

C 标准库的头文件 string.h 中提供了一个 strdup 函数:

char *strdup(char *s);

该函数的作用是复制字符串,返回的字符串的存储空间是动态申请的,不是原来字符串的空间。如果你是第 1 次听说有这个函数,不要妄自菲薄,我也是现在下才知道的O(∩_∩)O~

现在不用返回值,用 2 重指针来实现这个函数:

void my_strdup(char **p, char *s)
{
    unsigned int len = strlen(s) + 1;

    *p = (char *)malloc(len);
    memcpy(*p, s, len);
}

使用场景:

char *s = "abc";
char *d = NULL;

my_strdup(&d, s);

从这个例子中可以看出 2 重指针用于需要修改指针的时候,一般是要在函数中为指针动态地申请空间。而这一般可用返回指针来实现,但是如果有多个指针要一并修改,用 2 重指针就要方便很多,因为返回值只有 1 个,而参数的个数在语法上是没有限制的。

strdup 返回的字符串用完后不要忘了 free 哦!

另外,一般没有使用 3 重以上指针作参数的必要。

相关文章

  • 谈谈Java的方法参数传递机制

    值传递# Java的方法参数传递是值传递!是值传递!值传递!!!重要的事情说三遍。什么是值传递?一个很简单的例子:...

  • Java值传递、数据加密

    值传递 Java 基本类型值传递,引用类型值传递 内存图解:

  • Java中的参数传递

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

  • 解读Java参数传递

    Java语言的传递方式只有“按值传递”!“按值传递”! “按值传递”!重要的事情要说三遍。不过呢,按值传递可能还不...

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

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

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

  • 再学JS--函数参数传递类型

    JavaScript的函数参数传递分为按值传递、按引用传递以及按共享传递。 按值传递 什么是按值传递? 把函数外部...

  • Java值传递

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

  • 面向对象——方法的值传递和引用传递

    带参函数 方法的值传递 按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递 按值传递重要特点:传递的是...

  • JS是按值传递还是按引用传递?

    JS是按值传递还是按引用传递? 按值传递 VS. 按引用传递 探究JS值的传递方式 按共享传递 call by s...

网友评论

    本文标题:值传递

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