1. 數組作為函數參數
函數是我們學習程式設計語言最基本的東西了,我在此不再贅述。只討論一種特殊情況,就是數組作為函數的參數傳遞。
我們都知道,其實在傳遞數組的時候,實際上是傳遞了數組首元素的指標。明確了這一點之後,我們就可以思考下面的問題。
既然他只是傳遞了數組首元素的指標,那麼他必然無法知道整個數組的大小,因此,我們如果希望在函數中用到數組的長度,必須要進行顯式傳遞。
int Sum(int a[],int size)
{
int i ,sum=0;
for(i=0;i<size;i++)
{
sum+=a[i];
}
return sum;
}
那麼既然,函數無法檢測傳入數組的長度,我們也可以利用這一個特性來計算數組前N個數的和,或者是利用這一特性來告訴函數,實際上,數組的有效長度要小於數組的真實長度。
2. C99中變長數組作為函數參數
首先在數組一節中,我們談到了C99中的變長數組是個很好的東西。那麼我們來看看變長數組作為函數參數的情況。
我們看之前的代碼,size和a[]並沒有直接的聯絡,那麼當變長數組作為參數就會解決這樣的情況。
int Sum(int size,int a[size])
{
int i ,sum=0;
for(i=0;i<size;i++)
{
sum+=a[i];
}
return sum;
}
這個代碼,則明確地表示了數組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 ()
{
printf("Hello world");
}
但是實際上,這段函數有兩個缺陷:
A. 從編程風格上來看,最好顯式地聲明main函數沒有參數
B. main函數應該返回狀態代碼,在某些作業系統中,程式終止時可以檢測到狀態代碼,來監視程式是否正常結束。即使你不需要這個狀態代碼,其他人也可能需要。
因此,這個函數最好這樣來實現:
int main (void)
{
printf("Hello world");
return 0;
}
還記得我們之前說過exit(0)麼,我們之前說,在main函數中寫return 0和exit(0)是沒有區別的。那麼我們就來看看return 和 exit的區別。
exit屬於<stdlib.h>標頭檔,我們之前說過,0是狀態代碼中成功的意思,那麼為了更直觀,C標準庫為我們提供了這樣的兩個宏定義。
int main (void)
{
printf("Hello world");
exit(EXIT_SUCCESS); //成é功|
exit(EXIT_FAILURE); //失§敗ü
}
讓我們轉向定義可以發現:
/* Definition of the argument values for the exit() function */
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
在<stdlib.h>中的這兩個宏定義。但是這兩個值並不是固定的,而是由實現定義的。
另外,return 和 exit的一個最典型差異就是,在其他函數中調用return 不會引起程式的終止,但是無論在哪裡調用exit都會引起程式終止,我們看一個程式。
int main (void)
{
printf("Begin\n");
BreakTest();
printf("End\n");
}
int BreakTest()
{
return 0;
}
這段代碼不應該產生任何疑問:
接下來看下這段代碼:
int main (void)
{
printf("Begin\n");
BreakTest();
printf("End\n");
}
int BreakTest()
{
exit(EXIT_SUCCESS);
}
由此可知,exit使整個的程式都被終止了。