為了理解C語言中指針的行為,我對以下內(nèi)容(以下示例代碼)感到有些驚訝:#include <stdio.h>void add_one_v1(int *our_var_ptr){ *our_var_ptr = *our_var_ptr +1;}void add_one_v2(int *our_var_ptr){ *our_var_ptr++;}int main(){ int testvar; testvar = 63; add_one_v1(&(testvar)); /* Try first version of the function */ printf("%d\n", testvar); /* Prints out 64 */ printf("@ %p\n\n", &(testvar)); testvar = 63; add_one_v2(&(testvar)); /* Try first version of the function */ printf("%d\n", testvar); /* Prints 63 ? */ printf("@ %p\n", &(testvar)); /* Address remains identical */}輸出:64@ 0xbf84c6b063@ 0xbf84c6b0*our_var_ptr++由于第二個函數(shù)(add_one_v2)中的語句顯然與之不同,因此該語句究竟能做什么*our_var_ptr = *our_var_ptr +1?
3 回答

SMILET
TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
這是使C和C ++變得如此有趣的那些小陷阱之一。如果您想彎曲您的大腦,請找出這一點:
while (*dst++ = *src++) ;
這是一個字符串副本。指針不斷遞增,直到復(fù)制了值為零的字符。一旦知道了這種技巧的作用,您將永遠(yuǎn)不會忘記++如何再次處理指針。
PS您始終可以用括號覆蓋運(yùn)算符順序。以下將增加所指向的值,而不是指針本身:
(*our_var_ptr)++;

隔江千里
TA貢獻(xiàn)1906條經(jīng)驗 獲得超10個贊
好,
*our_var_ptr++;
它是這樣的:
取消引用首先發(fā)生,給您指示的存儲位置our_var_ptr(包含63)。
然后對表達(dá)式求值,結(jié)果63仍然是63。
結(jié)果被丟棄(您對此不做任何事情)。
our_var_ptr然后在評估后增加。它正在改變指針指向的位置,而不是指針指向的位置。
它實際上與執(zhí)行此操作相同:
*our_var_ptr;
our_var_ptr = our_var_ptr + 1;
說得通?馬克·蘭瑟姆(Mark Ransom)的答案很好地說明了這一點,只是他實際上使用了結(jié)果。
- 3 回答
- 0 關(guān)注
- 399 瀏覽
添加回答
舉報
0/150
提交
取消