C語言中,scanf("%d", &a),在設計這個語法結構時為什麼要有地址符&,沒有行不行?


scanf是要把輸入的東西賦給參數,但是c語言是值傳遞,這樣函數內部的a和你傳給它的a不是同一個變數,達不到賦值的目的。如果是c++等支持傳引用的語言,可以把參數設計成引用類型。c語言不支持,因此要改變參數的內容,就需要傳參數的地址進去,這樣函數內部對該地址的操作就是對該參數的操作,達到了scanf函數的目的。因此參數設計為指針。

不理解值傳遞的話,可以百度 c語言交換兩個變數值 應該很好懂。

ps:不知道我講清楚了沒。手機回答好費勁


如果a是個int你不寫就是程序崩潰吧,運氣好點會彈個窗或有錯誤消息什麼的。

不想要,你定義int* a;就可以了。但是要注意,只定義就是做了個野指針。要麼為其取其它變數的值(等於用了地址符),要麼new(malloc)一塊內存。

至於設計時scanf是不是一定要指針呢。答案是肯定的。為什麼?

因為scanf要對外輸出值,也就是說scanf函數內部有個值要傳到外面,交給調用者。這種要output的參數必須是指針,通過修改其指向的內存而傳回給調用者。所以說原則上output的參數是需要指針的。


scanf 需要的是變數地址,它會向地址對應的空間寫數據,有沒有沒關係,只是可以獲得地址。所以傳入數組名也是可以的,數組名就是地址。不過,scanf的實現可能是用指針變數存儲了變數地址,所以這裡傳入指針也是可以的,比如malloc的返回值。


你看下scanf的函數原型就明白了


去年這個時候我也思考過同樣的問題,試著回答下。樓主可以從函數入棧岀棧角度看,函數入棧,變數賦值,岀棧變數銷毀。因此,如果傳的是a,那岀棧之後a又變成入棧之前的值。傳遞的是指針就可以修改掉指針所指向的值,退棧之後a就變成了新的值!


輸入的時候一定要有 有地址才能知道往哪輸嘛


行啊。只要是一個地址表達式就可以。


指針傳遞和值傳遞的區別嘛


看源碼。


賦值就是給它所在的地址傳值


不行,這句語句是說,從用戶那裡讀入一個輸入,放到變數a里,而變數是要佔內存,每一個變數在內存里都有一個地址。初學者只要記住格式就好了


int a;
a = scanf("%d"); /* 如果函數設計成這樣,看著會舒服些,但只能返回一個值。 */

int a, b;
scanf("%d %d", a, b);
/* 為了返回多個值,你只能把想接收返回值的變數的地址給函數,讓函數填寫多個值到你給的地址中。 */


推薦閱讀:

有沒有求多邊形的狹窄部分的演算法?
寫不出數據結構的人是不是不適合編程?
Unity3D 如何做好版本控制?不限於腳本,包括圖片,模型等二進位文件。
paxos日誌回放應該怎樣去做?
喜歡編程語言理論,國內有什麼好去處?

TAG:編程 | 計算機 | C編程語言 | 計算機原理 | C語言入門 |