scanf 參數前為何加 &?printf 格式化輸出,scanf 格式化輸入,幾小時練習不難,但發現 scanf 參數要 &,printf 不用。例:
#include <stdio.h>
int main(void) {
int x, y;
y = (int)&x;
scanf("%d,%d", &x, y);
printf("%d,%08x", x, y);
return 0;
}
// 輸入 123,321
// 輸出 321,0012ff44
y 存 x 地址,scanf 把 y 當地址寫入,導致 x 被第二個輸入覆蓋。甚至可直接寫死地址 0x0012ff44 達到同樣效果。
int x, y;
y = (int)&x - (int)&y; // 地址差
scanf("%d,%d", 0x0012ff44, (int)&y + y);
printf("%d,%08x", x, y);
// 輸入 123,321
// 輸出 321,00000004
(int)&y + y = y 地址 + x-y 差 = x 地址,故寫入 x。但 y 變為地址差 4(int 4 字節)。
scanf 參數必須是地址:C 語言預設值傳遞,不給地址會修改副本(克隆人),原變量不變。給地址才能找到「本尊」。(參考《深入理解計算機系統》初步理解,後續再深究。)main 內變量佈局:先聲明在高地址,後聲明在低地址,連續聲明連續分佈。調試器觀察即可得知,調試器真好用!