C Primer Plus中說scanf 將字串讀入字元陣列不要加 ?

時間 2021-05-31 08:31:50

1樓:追遠·J

幾乎全靠一本The C Programming Language入門C語言的我,也在指標和陣列這裡徘徊了很久,但幸運的是沒走什麼彎路。我對這套規則的理解非常淺,可供參考。

要理解scanf這套規則,首先你得知道scanf對引數是怎麼規定的。scanf從第二個引數開始,按照格式符中規定的格式接受相應型別的指標,比如%d、%f就分別需要指向int和float的指標,這也就是基本型別的變數需要附加&的原因——直接書寫基本變數返回的是它的值,通過&運算子才能取到它的位址!

但%s不同,它需要的是乙個指向char的指標,沒錯,跟%c需要的東西是一樣的。%s跟%c不同的地方只在於%s不會唯讀入乙個字元,而是會向後連續讀入,直到讀到空白符為止(由於不包含原有陣列的長度資訊,很容易發生越界的情況)。

而回到字元陣列這裡,陣列名本身就會返回指向第乙個元素的指標,再使用&就沒意義了,並且應該視為錯誤。至於你編譯器為啥沒報錯,等你想明白前面寫的這些內容再來聊比較好。

首先必須指出的是,陣列不是C語言中的一等公民。C語言的陣列只能被看作在記憶體中連續排布的基本型別,你很少有機會能把它看成乙個整體

2樓:Zllf

在這裡功能上沒有任何區別的,不過依然建議用 s 而不是 &s陣列名即是首位址,而這個位址是乙個常量,c/c++是不允許出現 &常量這樣的指令,不過c/c++對陣列型別的"變數s"是允許的,對於陣列而言,編譯器會把 s 和 &s 變成同乙個彙編指令

lea eax,[s]

當你用乙個指標變數 p 來存放這個陣列位址時,再用這個p去執行你說的操作的話區別就大了

我覺得這不會增加學習成本,相反還能更好的了解指標至於為什麼對於陣列c/c++不直接禁掉 &s 這種行為讓人避免這麼多麻煩,我也不了解,不過不禁也沒事

3樓:離子雲

陣列的名稱不是乙個指標型變數,而單純是乙個編號。當編譯時會直接把對應位址給出,這一點很像C++的引用。但當把它當指標用時也能退化成指標,這就很迷

4樓:d41d8c

確實不要加&,否則編譯器會警告。現代編譯器都能識別printf和scanf,並且做對應的型別檢查。

標準C並沒有要求所有物件指標具有相同的表示方式。不過我知道的編譯器對所有物件指標都採用和void* 相同的二進位制表示和呼叫約定。所以用了錯誤的型別也沒關係。

但是標準並不保證這一點。

5樓:靈劍

C/C++就有這個奇怪的特性,就是陣列在很多時候像乙個值型別,但也不是乙個完全的值型別,同時又可以自動轉換為指標,char s[10]中s的型別是char (&)[10](這裡用C++的引用來描述),但卻可以自動轉換為char *;但&s的型別又不是char **了,而是char (*)[10],這是乙個指向陣列的指標,第一次解指標得到char (&)[10],再解指標可以得到char,但這個位址又剛好和s是一樣的,所以導致你輸入&s也能正常工作(但型別上其實是傳錯了)。但如果自動轉換為了指標,再取指標又會變成char **的型別,位址又跟s不一樣了。

C的printf的所有引數都認為是傳值,因此陣列型別在適配引數的時候會自動轉換為指標型別,實際傳遞的是陣列首個元素的位址,因此scanf讀取字串的時候不需要取位址;但因為前面提到的原因,實際上取了位址也能正常工作。這就跟一般的struct這樣的值型別不一樣,值型別傳遞給引數的時候,會把整個結構體複製一遍,而不是傳遞位址。

這些沒有什麼好辦法,只能靠記住。

Unity5 X中螢幕空間陰影投射技術 Screenspace ShadowMap 如何產生陰影圖

MaxwellGeng 書的作者樂樂女神已經給出了很詳細很親民的回答,但我還是想湊個熱鬧 親民的回答是不可能的了,硬核的回答倒是有 小聲BB MaxwellGeng GPU Driven Pipeline 工具鏈與高階渲染 在這篇文章中,我是使用了比較基礎的CommandBuffer的API實現了乙...

war3對戰中的變化是否比sc2更多?

WAR的變化比SC2多。WAR3有大量隨機數,包括攻擊力,護甲減傷形式,掉落物品,技能等,這些要素甚至能直接左右勝局。對某些英雄,例如劍聖,開局打出兩個攻擊之爪 頭環,和開局打出兩個護甲戒指,完全就是兩個等級的獎勵。連續出跳劈 怎麼也打不出跳劈,也會影響戰局,而這些和選手的發揮無關,只看運氣。 希爾...

為什麼說 JAVA中的ThreadLocal是最簡單的非阻塞同步 ?

Joash ThreadLocal是存在於Thread類中的資料結構。它用於遮蔽自己的資料,防止其他執行緒訪問。然而同步問題所涉及的不僅僅是乙個執行緒或者是程序。同步的出現必定涉及到了執行緒或程序間的共享資源。對比兩個概念真的沒有發現有什麼共同之處。multithreading ThreadLoca...