关于函数的实参,形参,值传递,址传递,引用传递的理解

本文详细解析了函数参数传递的几种方式,包括形参、实参的概念,值传递、址传递及引用传递的区别,并通过实例代码展示了每种传递方式下变量的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多考试题中都会考到这几个概念,虽然不是直接问你概念是什么,但是花样百出的代码,其实都是在考这个问题。花点时间缕一缕,以后万变不离其宗,遇到这样的问题就可以迎刃而解了。
1.形参
void fun(int a)
{
    a = 1;
}
上面函数中,a就是fun函数的形参,注意,它是在fun函数被调用时,fun函数自己申请的一个临时变量,这个变量存在于fun函数的整个运行周期中,函数结束,变量就被释放,注意这个参数是fun函数自己申请的,跟主调函数中的任何变量都没有任何关系,只是传参时,将实参的值赋值给形参罢了,实参没有被改变。
2.实参
void fun(int a)
{
    a = 1;
}
void main()
{
    int b = 0;
    fun(b);
    return;
}
上面代码中,a为形参,b为实参。
3.值传递
还是上面的例子,在代码运行过程中,当fun函数被main函数调用时,实际上经历了这样一个过程,fun函数自己创建一个临时变量,我们命名为temp,这个temp其实就是fun函数中的a,它接收了传进来的参数b,然后接下来的操作就和b没有关系了。用代码表示fun函数fun(b)的工作细节如下:
int temp = b;
temp = 1;
因此如果在main函数中fun(b);后面添加printf("%d",b);输出仍为0;而如果在fun函数定义中a = 1;后面添加printf("%d",a);输出则为1;因为此时打印的是fun函数自己创建的临时变量。
4.址传递
void fun(int *a)
{
    *a = 1;
}
void main()
{
    int b = 0;
    fun(&b);
    return;
}
址传递时和值传递稍有不同,但是实际上函数的运行过程是一样的,只是当实参的地址赋值给形参时,形参实参虽然是两个互不相干的指针变量,但他们指向的是同一块内存,因此,如上面的代码所示,如果fun函数中修改的是形参指向的内存中的存放的值,那么如果在main函数中fun(&b);后面添加printf("%d",b);时输出则为1;但是在实际试题中,我们经常会遇到的是fun函数修改的是指针的指向,而不是指针指向的内存中的值。如下代码所示:
void fun(string *a)
{
    a = (string*)"fun";
    return;
}
int main ()
{
    string b = "main";
    fun(&b);
    system("pause");
    return 0;
}
如果在main函数中的fun(&b);后面添加printf("%s",b.c_str());输出的值仍为main,因为在调用fun函数时经历的是这样的过程,fun函数申请了一个新的指针变量,在这里我们命名为temp,这个指针变量经传参后,指向的地址和&b一样,都是"main"所在的地址,但要注意,他们并不是同一个指针,是两个互不相干的变量,只是指向同一块内存地址罢了,在经过第二步操作时,指针temp的指向被重定向到新的变量"fun"所在的内存位置,但&b并没有发生任何变化,因此输出仍是"main"。如果想修改指针变量,那么就只能使用二级指针,其实原理是一样的,指针变量实际上也是存放在一块内存上的变量罢了。具体如下面的代码所示:
void fun(char **a)
{
    *a = "fun";
    return;
}
int main ()
{
    char *b = "main";
    fun(&b);
    system("pause");
    return 0;
}
如果在fun(&b);后面添加printf("%s",b);则输出结果为"fun"。因为在main函数中,将指针b的地址传给了fun函数,fun函数自己申请了一个二级指针,这个二级指针指向的内存中存放的是一个一级指针,这个一级指针指向的内存中存放的是"main"。fun函数中*a是一个指针,这个指针指向的是"main"所在的地址,经过*a = "fun";操作后,*a这个指针的值变了(注意,不是指针指向的值变了),即传进来的二级指针指向的内存中的值(一个原本指向"main"的一级指针)被修改了,因此再次打印b时,b已经是一个指向"fun"的指针了,并不是指向"main"的指针。
5.引用传递
类似于指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值