鍍金池/ 問答/C  C++/ 關(guān)于形參實參問題,求助 好人一生平安

關(guān)于形參實參問題,求助 好人一生平安

為什么fun()函數(shù)會改變實參的值而fun_函數(shù)卻不會呢?

#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;
}

我無法理解。
麻煩您說的仔細(xì)點,太簡單的回答我看了,但是我看不懂。

回答
編輯回答
久舊酒

void fun(int *q,int *p,int *w);修改的是指針指向的內(nèi)容(a, b, c)。void fun_(int *q,int *p,int *w);修改的是指針本身,而不是指向的內(nèi)容。

2018年4月12日 02:43
編輯回答
有你在

你這個代碼根本就不能編譯通過,你自己試過嗎?

2018年7月17日 17:03
編輯回答
扯不斷

可以通過自己"手動inline"來理解,即將與函數(shù)調(diào)用等價的代碼塊嵌入到調(diào)用的位置。嵌入過程中要注意,函數(shù)參數(shù)傳遞實際上是“形式參數(shù)被實際參數(shù)拷貝初始化”的過程。

fun的調(diào)用

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_的調(diào)用

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;
}

兩次調(diào)用被分別替換后,前三行等價原參數(shù)傳遞,后三行等價原函數(shù)體。
他們區(qū)別在于函數(shù)體中的三句賦值是否有對形式參數(shù)解引用:fun_沒有解引用,是對形式參數(shù)賦值;而fun有解引用,是對形式參數(shù)解引用這個表達(dá)式賦值,如*w1。兩者被賦值的對象是不同的,指針被解引用后得到的是指針?biāo)赶虻膶ο蟆?br>也就是說,這里fun_的調(diào)用中是對q1,p1,w1這些形式參數(shù)進(jìn)行賦值。而這里fun的調(diào)用中實際上是對a,b,c進(jìn)行賦值。(在這次調(diào)用中,q1與q指向同一個對象,q指向a,所以q1指向a;p1,w1同理)

2018年3月29日 16:53