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

C 語言 scanf 取地址符 & 使用全攻略:何時用、何時不用、為什麼

     編輯:程式設計綜合問答

核心規則

scanf 需要將讀取的數據寫入變量內存地址,因此參數必須是地址(指針)。

變量類型調用方式原因
基本類型(int, float, double, char 等)`&var`變量名代表值,需取地址傳遞指針
字符數組(`char str[20]`)`str` 或 `&str[0]`數組名退化為首元素地址,已是指針
指針變量(`char *p = malloc(10)`)`p`指針本身儲存地址,直接傳遞
結構體`&struct_var`結構體變量代表整個結構,需取地址
結構體指針`struct_ptr`指針已是地址

為什麼需要 &?

C 語言函數參數傳遞是值傳遞。若不傳地址,`scanf` 只能修改副本,無法將讀取結果返回給調用者的變量。傳遞地址後,`scanf` 通過指針解引用直接修改調用者內存中的變量值。

常見錯誤與調試


int a;
scanf("%d", a);      // 錯誤:傳遞值(未初始化垃圾值作地址)→ 段錯誤
scanf("%d", &a);     // 正確

char str[20];
scanf("%s", &str);   // 錯誤:&str 類型是 char(*)[20],與 %s 期望的 char* 不匹配(雖然地址相同,但類型不匹配,嚴格編譯器報警)
scanf("%s", str);    // 正確

安全增強版

防止緩衝區溢出,指定最大寬度:


char buf[100];
scanf("%99s", buf); // 最多讀 99 字符,留 1 位給 \0

檢查返回值:`if (scanf("%d", &a) != 1) { /* 輸入失敗處理 */ }`

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