首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 scanf 取址運算子 & 為何稱為「取地址」?

     編輯:程式設計綜合問答

初學者常見疑惑

程式碼:

int a;
scanf("%d", &a);

問題:`&` 明明是要把輸入的值存進 `a`,為何叫「取地址」而不是「取值」?

底層機制解析

1. 變數在記憶體中的模型

  • 宣告 `int a;` 時,編譯器在堆疊分配 4 位元組空間,假設位址為 `0x7ffeeb00`
  • 此位址即為 `a` 的「地址」,`&a` 的值即 `0x7ffeeb00`

2. scanf 的運作流程

  1. 從標準輸入讀取字元序列(如 `"123"`)
  2. 依格式字串 `%d` 解析為整數 `123`
  3. 將此整數寫入參數提供的記憶體位址

若呼叫 `scanf("%d", a)`(傳值),`scanf` 會拿到 `a` 當時的垃圾值(如 0),視為位址 `0x0` 寫入,導致段錯誤或竄改關鍵資料。

3. 為何要「取地址」?

C 語言採呼叫傳值,函式無法直接修改呼叫端的區域變數。必須傳遞變數的位址,函式透過指標解參考才能修改原變數。

類比說明

概念現實類比
變數 a你的家
a 的值 (10)家裡放的 10 元
&a (地址)家的門牌號碼
scanf 需要 &a郵差要門牌號碼才能把錢塞進你家門縫

進階:指標與 scanf

int *p = &a;
scanf("%d", p); // 正確,p 本身就是地址
scanf("%d", &*p); // 等價,&* 抵消

常見錯誤與除錯

  • 忘寫 `&`:編譯器通常警告 `format '%d' expects argument of type 'int *'`
  • 對陣列名加 `&`:`int arr[10]; scanf("%d", &arr);` 錯,`arr` 已退化為地址,應用 `arr` 或 `&arr[0]`

總結

`&` 稱為「取地址」是因為它的運算結果是變數的記憶體位址。`scanf` 需要這個位址以便將解析後的資料寫入該位址,完成「輸入 → 變數」的資料流向。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved