簡體   English   中英

有人可以用 C 解釋一下這段代碼嗎?

[英]Can someone explain this little piece of code in C?

輸出是:

25
28ff1c
28ff1c
25

我不明白為什么。 第一個值和地址可以理解,但為什么第二個輸出相同? g 的地址在函數中沒有改變嗎?

float add(int *x, int y)
{
    static float s = 100.f;
    s=s+y;
    x=x+y;
    return s;
}



int main()
{

    int g=25;
    printf("%d\n",g);
    printf("%x\n",&g);

    add(&g,35.2);

    printf("%x\n",&g);
    printf("%d\n",g);

return 0;
} 

您不能使用單個指針(即 int *x)更改變量的地址。 正如評論中所建議的那樣,如果您知道這一點,這可能不是您的本意。

要更改地址,您必須使用雙指針,您必須對其進行一次訪問以獲取地址並訪問該值,您必須對其進行兩次訪問。

void func(int **x)
{
    int value = **x;
    uintptr_t address = *x;

    *x = address + sizeof(int);
}

...但為什么第二個輸出相同?

因為你的原始代碼:

float add(int *x, int y)
{
    static float s = 100.f;
    s=s+y;
    x=x+y; // changing the pointer
    return s;
}

不改變 x 的地址指向的值。
如圖所示更改代碼以允許更新值:

float add(int *x, int y)
{
    static float s = 100.f;
    s=s+y;
    *x=*x+y; //changing the value pointed to by the pointer
             //(i.e., the value exposed via the de-referenced pointer is 
             //modified to a new value.)
    return s;
}

鑒於:

 int g=25;
 ...
 add(&g,35.2);

更改后的結果:

25
81feb8
81feb8
60

注意:因為第二個參數的類型: float add(int *x, int y)
int35.2被截斷為30 ,導致總和為
60而不是60.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM