[英]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)
是int
, 35.2
被截斷為30
,導致總和為
60
而不是60.2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.