陣列和函式預習中值得注意的地方
1.陣列認知
陣列在記憶體存放是有地址的,陣列名就是陣列在記憶體存放的陣列首元素地址。將陣列作為實參傳遞給形參有值傳遞和地址傳遞兩種方式,值傳遞不會改變陣列的值,地址傳遞有可能改變陣列的值。
char a[ MAX ] ;系統將分配MAX個字元的記憶體空間。
2.陣列常見的問題
對於一個數組 char a[ MAX ],來說,它的第一個和最後一個元素分別是a[ 0 ] 和 a [ MAX -1 ];其中 a[ MAX ] 是一個有效的地址,但該地址中的並不是陣列a 的一個元素。我們應該儘量避免檢視和使用 a[ MAX ] 。
陣列的元素可以是任何一種型別,而字串只是一個特別的陣列。
3.可不可以把另外一個地址賦給一個數組名
不可以!陣列名不能被放在賦值運算子的左邊(它不是一個左值,更不是一個可修改的值),一個數組是一個物件,而它的陣列名就是指向這個物件的第一個元素的指標。陣列名的含義是:這裡是一個數組中的第一個元素,它的前面沒有陣列元素,並且只有通過陣列下標才能引用它後面的元素。
4.函式的宣告與定義
無參函式的定義形式:
型別識別符號 函式名 () 其中,型別識別符號和函式名稱稱為函式頭。函式的型別是函式返回值的型別;函式名
{ 是由使用者定義的識別符號,函式名後面的括號不可少。
語句
}
有參函式的定義形式:
型別識別符號 函式名 (形式引數表列) 有參函式比無參函式多了形式引數(形參)表列,形參可以是各種型別的
{ 變數,各引數之間用逗號間隔。在進行函式呼叫時,主調函式會將賦予形參實
宣告部分 際的值。形參表中必須給出形參的型別說明。
語句
}
5.形式引數和實際引數
函式在呼叫時把一些表示式作為引數傳遞給函式。函式定義中的引數是形式引數,函式的呼叫者提供給函式的引數是實際引數。在函式呼叫之前,實際引數的值將被複制到這些形式引數中。
6.引數傳遞
在c語言中發生有參函式呼叫時,實參變數和形參變數之間的資料都是單項的“值傳遞”方式,包括指標變數和陣列名作引數的情況。
簡單變數和陣列元素作為函式引數時,只需將變數的值複製一份到形參中操作,在被呼叫函式中形參和實參不在同一記憶體單元中,在呼叫結束後形參所佔的記憶體單元被釋放,因此呼叫函式不會影響到實參變數的值,也不會影響到主調函式中其他變數的值。
指標變數作為函式引數時,值傳遞和上述值傳遞無區別,但發生地址傳遞時,這個地址為形參訪問其所指定的變數創造了可靠條件;陣列名作為函式引數時,作為實參時其傳遞給形參的是記憶體中某個指定的地址,呼叫過程中形引數組和實引數組佔用同一段記憶體單元,因此對形引數組的操作也就是對實引數組的操作。
7.編寫多個返回值的C語言函式
return返回函式值只能返回一個值,想要編寫返回多個返回值的C語言函式,有三種方法:利用全域性變數、傳遞陣列指標、傳遞結構體指標。利用全域性變數,我們可以考慮把要返回的多個值定義成全域性變數。當函式被呼叫時,全域性變數被更改,我們再把個更改後的全域性變數值應用於主調函式中,函式被呼叫後被更改後的全域性變數值即為函式的整個返回值。注意:這種方法不能保證值得正確性,因為在程式範圍內都可以修改它的值,如果出錯將難以發現,而且全域性變數增加例程式間模組的耦合,所以要慎用。
8.回撥函式
回撥函式是C語言裡面對函式指標的高階應用。回撥函式就是一個通過函式指標呼叫的函式。如果把函式指標(函式的入口地址)傳遞給另一個函式,當這個函式指標被用來呼叫它所指向的函式時,那這個函式是回撥函式。
9.變參函式:printf的實現
printf()函式的原型為:
int printf( const char * format ,. . .);它除了有一個引數format固定以外,後面跟的引數的個數和型別是可變的,(用三個點“. . . ”作為佔位符)。
10.可變引數問題:執行時才確定的引數
函式引數的具體形式可以在執行時才確定:main( )函式可以實現。原型為:
int main (int argc ,char *argv [ ] );函式的引數是argc 和argv
沒有辦法從宣告中看到所接收的引數,引數根本沒有固定的形式,我們可以定義一個“void *”型別的引數,用它來指向實際的引數區,然後在函式中根據需要解釋它們的含義。