C語言學習筆記 5

2021-09-05 23:18:14 字數 2184 閱讀 9733

1. 陣列作為函式引數

函式是我們學習程式語言最基本的東西了,我在此不再贅述。只討論一種特殊情況,就是陣列作為函式的引數傳遞。

我們都知道,其實在傳遞陣列的時候,實際上是傳遞了陣列首元素的指標。明確了這一點之後,我們就可以思考下面的問題。

既然他只是傳遞了陣列首元素的指標,那麼他必然無法知道整個陣列的大小,因此,我們如果希望在函式中用到陣列的長度,必須要進行顯式傳遞。

int sum(int a,int size)

那麼既然,函式無法檢測傳入陣列的長度,我們也可以利用這乙個特性來計算陣列前n個數的和,或者是利用這一特性來告訴函式,實際上,陣列的有效長度要小於陣列的真實長度。

2. c99中變長陣列作為函式引數

首先在陣列一節中,我們談到了c99中的變長陣列是個很好的東西。那麼我們來看看變長陣列作為函式引數的情況。

我們看之前的**,size和a並沒有直接的聯絡,那麼當變長陣列作為引數就會解決這樣的情況。

int sum(int size,int a[size])

這個**,則明確地表示了陣列a的長度是size,也就是說在size和a之間建立起了直接的聯絡。

但是在這裡我們需要注意一點,就是引數的順序,長度一定要寫在陣列之前,否則會出現a[size]找不到size的錯誤。

在進行函式宣告時,我們可以有以下幾種方式:

int sum(int ,int a[*]);

int sum(int n ,int a[n]);

int sum(int n, int a[*]);

int sum(int ,int a);

int sum(int n ,int a);

個人比較推薦第一種,因為我覺得第一種最為簡便,而且可以表明a是乙個變長陣列。像第四種和第五種,我個人認為是兩種很不好的方式。

3. c99中陣列引數宣告使用static

c99中允許在陣列引數宣告中使用關鍵字static。例如:

int sum(int a[static 10],int n)

從函式本身來講,static並沒有對函式的本身實現造成任何影響。static 10的含義是陣列的長度至少是10。那麼當函式呼叫時,編譯器會事先從記憶體中取出10個數,而不是在函式呼叫的時候才一次次的去取,這樣就可以使函式的效率更高。

4. main函式的返回值

在初學c語言的時候,譚老的書上大部分都是這樣的**:

void main ()

但是實際上,這段函式有兩個缺陷:

a. 從程式設計風格上來看,最好顯式地宣告main函式沒有引數

b. main函式應該返回狀態碼,在某些作業系統中,程式終止時可以檢測到狀態碼,來監視程式是否正常結束。即使你不需要這個狀態碼,其他人也可能需要。

因此,這個函式最好這樣來實現:

int main (void)

還記得我們之前說過exit(0)麼,我們之前說,在main函式中寫return 0和exit(0)是沒有區別的。那麼我們就來看看return 和 exit的區別。

exit屬於標頭檔案,我們之前說過,0是狀態碼中成功的意思,那麼為了更直觀,c標準庫為我們提供了這樣的兩個巨集定義。

int main (void)

讓我們轉向定義可以發現:

/* definition of the argument values for the exit() function */

#define exit_success 0

#define exit_failure 1

在中的這兩個巨集定義。但是這兩個值並不是固定的,而是由實現定義的。

另外,return 和 exit的乙個最典型差異就是,在其他函式中呼叫return 不會引起程式的終止,但是無論在**呼叫exit都會引起程式終止,我們看乙個程式。

int main (void)

int breaktest()

這段**不應該產生任何疑問:

接下來看下這段**:

int main (void)

int breaktest()

由此可知,exit使整個的程式都被終止了。

C語言學習筆記5

持續更新一些 c語言學習 的筆記。上次說到語言程式的編寫和執行,那麼接下來進行一下補充。編寫和執行過程 使用文字編輯工具編寫c 程式,其檔案字尾為.cpp,這種形式的程式稱為原始檔 source code 然後用編譯器將源 轉換成二進位制形式,檔案字尾為.obj,這種形式的程式稱為目標 object...

C語言學習筆記5

回顧 1.負數的二進位制轉換規則 2.操作符 算數操作符,邏輯操作符,位操作符,三目操作符 作業 1.提示奇數或偶數 2.提示正負數 移位操作符 左移 和右移 3 2 0000 1100 左移固定在右邊補0 12 2 0000 0011 有符號數字右移左邊補符號位 無符號數字右移左邊補0 取位址操作...

C語言學習筆記5

int num 5 int p num type 列印時的值 第二次列印的值 源位址的值 陣列內的值 p 1020 10 p 和 的優先順序相同,根據結合性是從右往左,所以p先和後自增運算子 相結合,操作會在表示式完成後進行自增,也就是先取出p位址裡的值,然後p的下標後移一位type 列印時的值 第...