C語言學習筆記(5)

來源:互聯網
上載者:User

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使整個的程式都被終止了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.