美烦资源网

专注技术文章分享,涵盖编程教程、IT 资源与前沿资讯

C语言 一文讲透函数传参:传值和传址的原理

函数参数的传递方式

C语言中,函数参数的传递方式大概可以分为两种,一种是传值,另一种则是传址

传值

传值,顾名思义,就是传递实参的值,而且是值的一个拷贝,该种方式下,实参的值经过函数中的程序之后,一般不会被修改,比如下面的这段示例代码,实参y的值并没有被修改,仍然为1。

#include <stdio.h>
// b为形参
void add1(int b) {
    b++;
}
int main() {
    // y为实参
    int y = 1;
    add1(y);
    printf("y的值未被修改,为:%d\n", y);
    return 0;
}

这是为什么(原理)

个人认为,这是因为,函数add1()被调用后,是形参b这样一个局部变量加1并重新赋值给b,并不是实参y,局部变量b只是在函数被调用的时候,被定义,并初始化赋值为变量y的值,而且只是y值的一个拷贝,之后y就不参与到函数的执行过程了,因此y的值不会被修改。

传址

C语言函数的另一种传递参数的方式是传址,即传递给函数的是变量的内存地址,比如下面这段代码,xyz的值是会被修改的:

#include <stdio.h>
void add2(int *c) {
    *c = *c+1;
}
int main() {
    int xyz = 2;
    add2(&xyz);
    printf("xyz的值被修改,为%d\n", xyz);
    return 0;
}

代码编译运行,得到输出:

xyz的值被修改,为3

这是为什么

(个人认为)通过将函数的形参声明为指针类型,那么,在函数调用的时候,传递给函数的便是实参指向的内存地址,如此一来,函数形参接收到的值便是变量的内存地址,如此,函数虽然仍然操作的是函数自己的局部变量(形参),并不是实参但是改变了内存地址上的值,由此,任何指向该内存地址的变量的值都会被改变。比如,修改指向指针的二级指针的值,一级指针的值也会被修改,比如下面这段示例代码:

#include <stdio.h>
int main() {
    int a = 1;
    int *p = &a;
    int **p2 = &p;
    **p2 = 2;
    printf("p指针指向的值被修改为:%d\n", *p);
    printf("变量a的值也被修改为:%d\n",a);
    return 0;
}

如上代码编译运行,得到输出:

p指针指向的值被修改为:2
变量a的值也被修改为:2

全栈开发助手原文:「链接」

免责声明:内容仅供参考,不保证正确性,不作任何决策依据!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言