首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言入門筆記(六):scanf 為何要取地址?變量記憶體佈局探秘

     編輯:關於C語言

疑問: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 字節)。

總結

  1. scanf 參數必須是地址:C 語言預設值傳遞,不給地址會修改副本(克隆人),原變量不變。給地址才能找到「本尊」。(參考《深入理解計算機系統》初步理解,後續再深究。)
  2. VC6.0 中 main 內變量佈局:先聲明在高地址,後聲明在低地址,連續聲明連續分佈。調試器觀察即可得知,調試器真好用!
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved