C 隨記(六) 函式處理陣列的一些問題

2021-08-02 09:36:56 字數 1092 閱讀 6420

通常,我們按照以往設定形參的習慣,可能會對陣列形參做如下的書寫:

int example( int arr[ ], int n); //arr是乙個陣列名,n是這個陣列的大小

但仔細想一下,arr作為陣列名應該是乙個指標才對,而實際上,更標準的函式頭應該是這樣的:

int example(int *arr, int n);
其中用 int *arr 替代了 int arr[ ],

這兩個函式頭其實都是正確的,在c++中,當且僅當 用於函式頭或者函式原型中, int arr[ ]和int *arr 的含義是相同的,都意味著arr是乙個int型別的指標。

只不過,用 int arr[ ]其實能夠提醒我們,在這裡arr不但是乙個指標,而且是指向乙個 int陣列的首元素的指標,說白了就是告訴我們,這裡應該是乙個陣列而不是普通的指標形參。所以在實際程式設計中,使用陣列表示法其實更容易理解程式。

實際上,陣列作為形參的時候,函式並沒有把陣列的內容傳遞過來,而是通過另一種方式來對這個陣列進行操作,(int arr[ ], int n)將陣列的位置(首元素的位址)、陣列的型別(此處是int)、陣列的大小(即元素個數n)這三個關鍵資訊傳遞過來了,這樣實際有點類似與按指標傳遞,所以常規變數的形參,實際是對改變量的乙個拷貝(值傳遞),而陣列作為形參時,是對原來的陣列進行操作(指標傳遞)。

熟悉c++值傳遞和指標傳遞的朋友應該馬上就明白這個意思了。這個問題在二級或者期末考試中已經被考爛了。

將陣列名與指標對應的好處在於:如果我每次都是要像常規變數一樣做乙個陣列的拷貝,記憶體的開銷就比較大了,函式並不是每次都對陣列的所有元素進行操作啊,而指標傳遞的話,相當於是對原陣列進行操作,並沒有開闢新的記憶體。

注意:為將陣列型別和元素數量告訴陣列處理函式,務必通過兩個不同的引數來傳遞它們:

int exam( int arr[ ], int n);//  right!

int exam(int arr[n]);// wrong!

C語言陣列的一些問題

我們都知道,陣列名可以當成乙個指標,同樣的函式名也可以當成乙個函式指標,指向函式的入口位址。現在有乙個問題,陣列名這個指標指向的是什麼呢?如果對陣列名再取位址,得到的又是什麼呢?我們來驗證這兩個問題。輸入以下 include stdio.h int main int p 3 a printf d,d...

C 一些問題

1 if else語句和switch case語句的效率分析對比 switch效率高。switch的效率與分支數無關,當只有分支比較少的時候,if效率比switch高,因為switch有跳轉表。分支比較多,那當然是switch 根據大量的實際程式測試 不考慮不同的編譯器優化程度差異,假設都是最好的優...

CLOB處理的一些問題

1 clob超過2的15次方時,隱式字元轉換會失效,導致無法拼接數字至clob 我用如下指令碼做了測試,當 clob 超過32767 的時候拼接數字就是出現問題 字元轉換失效 需要對數字進行轉換才能拼接成功 32767 應該是clob 乙個儲存塊的大小吧.具體原因還需要查閱 clob 相關文件 有更...