美文网首页C语言
函数形参中值传递与地址传递

函数形参中值传递与地址传递

作者: 风情云 | 来源:发表于2020-03-23 21:48 被阅读0次

函数形参中有两种传值方式,直接传值与间接的地址传值。下面说说这两种方式的差别:

值传递

形参中值传递,并不会改变原值的数据。因为原址只是拷贝一份数据传进去,修改的值是拷贝的数据。

void swap(int a,int b)
{
    int c = a;
    a = b;
    b = c;
    printf("func: a = %d, b = %d\n",a,b);
}

int main()
{
    int a = 10;
    int b = 20;
    swap(a,b);
    printf("a = %d, b = %d\n",a,b);
}

结果

func: a = 20, b = 10
a = 10, b = 20
值传递

可以看到原先的a,b值并没有改变,因为传进函数的是原值的拷贝,函数一运行结束,这些拷贝的变量就会被系统回收,函数内部的数据处理与函数外部的原值一点联系也没有。值传递没法改变原值的数据。

地址传递

使用地址传递,可以在函数内部通过*间接操作来改变函数外部的原值。

void swap(int *a,int *b)
{
    int c = *a;
    *a = *b;
    *b = c;
    printf("func: a = %d, b = %d\n",*a,*b);
}

int main()
{
    int a = 10;
    int b = 20;
    swap(&a,&b);
    printf("a = %d, b = %d\n",a,b);
}

结果

func: a = 20, b = 10
a = 20, b = 10
地址传递

使用地址传递,函数内部的拷贝变量与函数外部的变量有关联,拷贝变量指向原值得地址,这样可以通过*间接操作修改原值。

使用值传递的场景

如果并不需要改变原值,只是通过原来原值来得到一些数据。比如求和,遍历数组等等这些函数,可以使用值传递当作形参,然后返回需要的数据。例如:

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

int main()
{
    int a = 10;
    int b = 20;
    int sum = add(a,b);
    printf("sum = %d\n",sum);
}

结果

sum = 30

使用地址传递的场景

如果需要某个函数体来改变函数外部的值,且开辟在栈的内存中,就只能使用地址传递来实现。

//求绝对值
void myabs(int *a)
{
    if(*a < 0) *a = -(*a);
}

int main()
{
    int a = -10;
    myabs(&a);
    printf("b = %d\n",a);
}

地址传值的形式

我们如果想要传进去的值改变函数外部的值,就使用地址传递,但是有时形参的数据类型不清楚,下面说一种方法,就是形参总是比原值的数据类型多一个。这很好理解,想一下获得某个int类型的变量地址,就要定义int指针类型,如果是获得int类型的地址,就定义int*类型的变量接收。

int a;
//形参
int * b;

int *a;
//形参
int **b;

总之就是形参的数据类型总是比原值的数据类型多一个*,使用时传值记得使用&,不然报错。


微信号

相关文章

  • 函数形参中值传递与地址传递

    函数形参中有两种传值方式,直接传值与间接的地址传值。下面说说这两种方式的差别: 值传递 形参中值传递,并不会改变原...

  • 面试题

    1,函数参数传递中值传递、地址传递、引用传递有什么区别? (1) 值传递,会为形参重新分配内存空间,将实参的值拷贝...

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

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

  • 函数与数组

    当函数的形参为基本数据类型时,是值传递,函数内部改变形参,外部实参的值不变 当函数的形参为数组时,是内存地址的传递...

  • 第七章 函数(2)函数参数和按值传递

    (二)函数参数和按值传递 1.形参,实参,参数和参量 函数参数的传递中,用于接收传递值的变量被称为形参,传递给函...

  • 嵌入式day09

    数组在函数间传参 全局数组传递方式 复制传递方式 实参为数组的指针,形参为数组名(本质是一个指针变量) 地址传递方...

  • c语言函数

    [if !supportLists]1.[endif]值传递:(单向传递实参->形参)关于函数调用过程中形参和实参...

  • 关于地址传递的一处笔记

    1. 值传递与地址传递 值传递:形参和实参占不同内存单元,传递的实际上是实参变量或表达式的一个拷贝副本。形参的值发...

  • JAVA基础----内部类 工具类

    ## 一、参数传递 ##01. 类名作为形参和返回值 总结: * 类名作为方法的形参传递的是什么? 传递是地址值 ...

  • C++函数参数传递

    引用传递和值传递 1. 值传递 当形参是非引用类型时,实参的值会被拷贝给形参,实参和形参是两个完全不同的对象,函数...

网友评论

    本文标题:函数形参中值传递与地址传递

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