scanf函式中引數是否需要 取位址符號

2021-10-19 07:16:49 字數 1295 閱讀 2790

scanf函式中引數是否需要&取位址符號

scanf函式引數不一定要加&:

(1)當scanf函式後面接收的是乙個位址的時候,不需要加&

int main()

(2)當scanf函式後面接收的不是乙個位址的時候,需要加&

int main()

補充:陣列是一組有序資料的集合,陣列中的每乙個資料都屬於同乙個資料型別,並且按順序存放在乙個連續的儲存空間中,即最低的位址存放第乙個元素,最高的位址存放最後的乙個元素。

以一位陣列為例:

int a[10]=;說明定義了乙個整型陣列,陣列名為a,共有10個元素,在「{}」中存放這10個同乙個資料型別元素,每個元素用逗號隔開。

陣列名是陣列的首位址,可以找到陣列中的各個元素。

即:int a[5]=;

int a[x],為陣列的首位址;"x"為小於10的數,即為元素的位址。

另外:陣列名是陣列的首位址,就是陣列中第乙個元素的位址,是常量。常量是不能出現在賦值號=左邊作為左值的

說陣列名就是指標是錯誤的,指標是變數,是用來儲存變數位址值的變數,而陣列名是常量

一般情況下宣告乙個陣列,比如char a[10];之後,陣列名a就是陣列的首位址,是乙個位址常量

但是在函式宣告的形參列表中除外。比如:int function(char a[10]);

在這種情況下這樣的宣告與 int function(char a); int function(char* a); 是等價的

就是說這種情況下,就算你寫的是陣列的形式,編譯器實際處理的時候也當指標來處理(注意指標是變數,形參也是變數,二者剛好對應)

所以在函式function內部,你對a進行++, --, +=,=之類的帶賦值的操作是完全合法的,因為此時a就是乙個指標,不是陣列名

當你往函式function裡面傳入乙個已經事先宣告的陣列的首位址時候,指標a裡面的值就是你這個已經宣告的陣列的首位址

這樣你在function裡面就可以對你那個陣列進行操作

正是因為c有這個傳位址的優點,所以省略了很多不必要的拷貝工作

試想如果沒有這個傳位址,你傳乙個有幾萬個元素的陣列進去,那拷貝工作是相當可觀的

所以比如可以對int main(int argc, char* ar**);裡面的ar**進行++操作

既然「main函式的第二個形參是乙個指向字串的指標陣列」,ar**出現在函式宣告中

所以它實際上是乙個指標,它並不是「乙個指向字串的指標陣列」

而是乙個可以獲取「乙個指向字串的指標陣列」的首位址值的變數。

其他對於陣列名的討論:

陣列名與指標的關係比較複雜,還有很多地方值得思考

函式是否需要宣告 複習

這其實是要看程式設計的語言是不是完全物件導向語言 和類有關係 如果是c 這種完全物件導向的語言,因為它所有的東西都可以說是類或者說是類的方法或者類的成員函式,對 於完全物件導向的程式設計而言,在類中定義的方法的實現 也就是包含了方法的宣告,在類裡定義方法沒有先後順 序,定義在後面的方法也能被定義在前...

c中scanf函式用法

初看scanf時,覺得還是蠻簡單的,但當深入學習後,才發現裡面有很多小細節值得我們去注意。首先,看看scanf的基本格式 scanf 格式化字串 位址表 scanf 函式返回成功賦值的資料項數,出錯時則返回eof。我們輸入的資料大體上可以分為幾個型別 格式化說明符 空白符 空白符包括 空格,製表符,...

scanf 函式的引數輸入型別不匹配問題

scanf 函式的引數輸入型別不匹配問題 這是我在csdn論壇上見到的問題,這個錯誤有時候會讓人莫名其妙。include main 當輸入a 回車 後,會直接跳過下面 個scanf語句,直接輸出為 123 t 原因 對於scanf d c a,c scanf語句執行時,首先試圖從緩衝區中讀入乙個 d...