关于形参实参问题,求助 好人一生平安

为什么fun()函数会改变实参的值而fun_函数却不会呢?

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

}

void fun_(int *q,int *p,int *w)
{
     w=q;
     q=p;
     p=w;

}

int main()
{  
    int a=2,b=3,c=4,*q=&a,*p=&b,*w=&c;

    fun(q,p,w);
    //然后再用fun_(q,p,w);
    printf("q=%d  p=%d w=%d",*q,*p,*w);
    
   return 0;
}

我无法理解。
麻烦您说的仔细点,太简单的回答我看了,但是我看不懂。

阅读 2.2k
3 个回答

你这个代码根本就不能编译通过,你自己试过吗?

void fun(int *q,int *p,int *w);修改的是指针指向的内容(a, b, c)。void fun_(int *q,int *p,int *w);修改的是指针本身,而不是指向的内容。

可以通过自己"手动inline"来理解,即将与函数调用等价的代码块嵌入到调用的位置。嵌入过程中要注意,函数参数传递实际上是“形式参数被实际参数拷贝初始化”的过程。

fun的调用

void fun(int *q1, int *p1, int *w1) {
    *w1 = *q1;
    *q1 = *p1;
    *p1 = *w1;
}

int main() {
    int a=2, b=3, c=4, *q=&a, *p=&b, *w=&c;

    // fun(q, p, w);
    {
        int *q1 = q;
        int *p1 = p;
        int *w1 = w;

        *w1 = *q1;
        *q1 = *p1;
        *p1 = *w1;
    }
    return 0;
}

fun_的调用

void fun_(int *q1, int *p1, int *w1) {
    w1 = q1;
    q1 = p1;
    p1 = w1;
}

int main() {
    int a=2, b=3, c=4, *q=&a, *p=&b, *w=&c;

    // fun_(q, p, w);
    {
        int *q1 = q;
        int *p1 = p;
        int *w1 = w;

        w1 = q1;
        q1 = p1;
        p1 = w1;
    }
    return 0;
}

两次调用被分别替换后,前三行等价原参数传递,后三行等价原函数体。
他们区别在于函数体中的三句赋值是否有对形式参数解引用:fun_没有解引用,是对形式参数赋值;而fun有解引用,是对形式参数解引用这个表达式赋值,如*w1。两者被赋值的对象是不同的,指针被解引用后得到的是指针所指向的对象。
也就是说,这里fun_的调用中是对q1,p1,w1这些形式参数进行赋值。而这里fun的调用中实际上是对a,b,c进行赋值。(在这次调用中,q1与q指向同一个对象,q指向a,所以q1指向a;p1,w1同理)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题