數組作參數

來源:互聯網
上載者:User

http://bigwhite.blogbus.com/logs/2144933.html

 

C語言中的數組和指標總保持著'千絲萬縷'的聯絡,這裡僅針對數組作為函數實參時的情況做些說明^_^。

C語言中的數組可分為一維數組和多維陣列兩類,而多維陣列中又以二維數組最為常見。這裡也僅針對這一維數組和二維數組作簡要說明。

看過'高品質C++編程指南'的人可能都知道書中有這樣一句'注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指標',這句話針對一維數組固然是正確的,但是對於多維陣列,這顯然不完全正確。但是如果你說C語言中的數組預設就指一維數組,那麼這也就過得去了。C語言之所以把數組形參當作指標是出於效率考慮,試想如果把一個數組全部拷貝這樣勢必帶來效能上的損失,如果數組很大的話,這種完全拷貝的方法就是不能忍受的了。所以目前無論你在函式宣告中像'void func1(char a[])'這樣寫,還是像'void func1(char *a)',編譯器都會把它看成後者的形式,對於一維數組,顯然這沒什麼可說的,但是對於二維數組來說,其中還有不少值得商榷的地方。

C語言中的二維數組可以看作為'數組的數組',而且其採用'行主序',即'最右邊的下標'是最先變化的。由於指標和數組的關係導致,二維數組可以廣義表示為多種形式:
(1) char a[m][n] -- 標準形式;
(2) char *p[n] -- 指標數組形式;
(3) char (*p)[n] -- 數組(行)指標的形式
(4) char **p -- 指標的指標的形式

這些形式雖然都能表示二維數組,但是它們並不等價,這也給參數原型設計帶來一定的不便,不過二維數組作為參數後的轉化還是有原則可循的,那就是:'數組的數組'被轉換為'數組的指標',下面就逐一說說每種形式對應的函數參數原型,通過例子認真體會一番:
(1) char a[m][n] -- void func(char (*p)[]); 二維數組退化為數組的指標,關於如何聲明數組的指標,可以參見"理解C複雜聲明之'優先順序規則'"和"C複雜聲明解析"兩篇文章;
(2) char *p[n] -- void func(char **p); 這個是一個指標數組,我們只需要取地址即可;
(3) char (*p)[n] -- void func(char (*p)[]); 這個本身就是一個數組指標,原封不動即可;
(4) char **p -- void func(char **p); 對於指標的指標類型,同樣原封不動。

三維以上的數組不常用,用起來也較複雜,這裡不作說明。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.