scanf("%s", str) 中 str 是字符數組名,在表達式中會隱式轉換為指向首元素的指針(即 &str[0]),因此不需要額外的 &。而 scanf("%d", &n) 中 n 是整型變量,需顯式取地址傳遞指針。
char str[]):數組名即首地址,直接傳遞 str 等價於 &str[0]。int, float, double 等):必須使用 & 取地址。int *p = &n;,則 scanf("%d", p) 直接傳遞指針值,無需再取地址。int n;
int *p = &n;
scanf("%d", p); // 正確,p 本身就是地址
char str[20];
scanf("%s", str); // 正確,str 退化為指針
// 錯誤示例
scanf("%s", &str); // &str 類型是 char(*)[20],與 %s 期望的 char* 不匹配「數組名是地址,普通變量取地址,指針變量直接用」。