函数调用中实参和形参变化问题

本文解析了C语言中函数参数的传递方式,包括值传递与地址传递的区别,以及如何通过指针来实现实参值的修改。

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

  很多初学者搞不明白子函数中什么时候可以改变实参值,什么时候不会改变。今天来具体分析下。

先来解释下实参和形参,所谓实参,就是通过主函数传递给子函数的变量。而子函数中用来接收变量的参数就称形参。如下:

#include<stdio.h>
void fun(int p,int q)
{
   int temp;

   temp = p;
   p = q; 
   q = temp;

   return ;
}

int main()
{
   int x = 1,y = 2;

   fun(x,y);

   printf("%d\t%d\n",x,y);

   return 0;
}</span>
这段程序的输出结果为1    2。

以上代码中,x,y是main函数要传递给子函数fun的实参,而p,q就是用来接收x和y的值的形参,所以,形参和实参的类型必须相同。 函数在传参过程中,是一个内容的拷贝过程,而每个函数都会有自己的栈空间来存放局部变量,所以,形参和实参是不同的内存单元。通俗点讲,就是,你改变他们其中一个的值,另一个的值不会改变。

    如上程序,main函数将x和y传给了fun函数的p和q,相当于p和q是对x和y的拷贝,p和q是存放于fun函数的栈空间的,x和y是存放于main函数的栈空间,它们是不同的内存单元,所以在fun函数中交换p和q的值并不影响x和y的值,x和y的值仍然分别为1和2。而且,随着fun函数的结束,p和q这两个局部变量会被释放。

    但是,当你传递的参数是个指针的时候,就可以改变实参的值,以下通过程序来详细分析

#include<stdio.h>
void fun(int *p,int *q)
{
    int temp;

    temp = *p;
    *p = *q; 
    *q = temp;

    return ;
}

int main()
{
    int x = 1,y = 2;

    fun(&x,&y);

    printf("%d\t%d\n",x,y);

    return 0;
}</span>

这段程序的输出结果为2    1。这是为什么呢?

    main函数在给fun函数传递参数时,传递的是x和y的地址,而fun函数用p和q接收了这两个地址,也就是,p中存放的是x的地址,q中存放的是y的地址,即*p和*q就分别是x和y了,然后再将*p和*q进行交换,也就是将x和y进行了交换,所以最终x的值为2,y的值为1。

    但是如下程序传了指针,却没有改变x和y的值:

#include<stdio.h>
void fun(int *p,int *q)
{
    int *temp;

    temp = p;
    p = q; 
    q = temp;

    return ;
}

int main()
{
    int x = 1,y = 2;

    fun(&x,&y);

    printf("%d\t%d\n",x,y);

    return 0;
}

这段程序输出结果为1    2。为什么呢?

    虽然main函数将x和y的地址传给了fun函数,但是fun函数交换的是p和q的值,也就是,只对两个地址进行了交换,此时p中存放y的地址,q中存放x的地址,但是,这并没有影响x和y的值,所以x仍为1,y仍为2。

    由上面3个程序,我们可以知道,对子函数形参的改变,并不影响main函数实参的值;但是,当main函数实参传递的是变量的地址,子函数形参作为指针p的时候,对*p进行操作,会改变main函数中变量的值;但是如果单纯对指针p进行操作,也一样不会影响main函数中实参的值。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值