C 中陣列以及多維陣列作為函式引數時的一些問題

2021-07-23 16:41:33 字數 1367 閱讀 9329

output1(ia, sizeof(ia)/ sizeof(ia[0]));

今天在做《c++ primer》上的習題的時候,遇到了乙個小問題。

原始函式如下:

void output1(int a) 

cout << endl;

}

陣列a為一維整型陣列,利用函式實現元素的依次輸出。但是編譯器在
for (int i : a)

處提示錯誤,int*不能用在此處。細想之前書中的細節,我明白了,c++傾向於將陣列名直接當作陣列第乙個元素的首位址,即陣列作為函式的引數,實際是傳址操作。上網查閱,看到這篇部落格:也印證了這一想法。

藉此,整理一下,c++中,陣列作為函式引數的一些注意事項,包括多維陣列;

1.一維陣列

在函式中傳遞陣列時,如上的呼叫,實際只傳遞了陣列的首位址,不能將陣列的長度資訊傳遞出去,因此,解決方案就是,將陣列的長度資訊傳入函式,如下時是我修改後的輸出函式:

void output1(int a, int len) 

for (int i : ia)

cout << endl;

}

呼叫函式語句如下:

output1(ia, sizeof(ia)/ sizeof(ia[0]));

利用sizeof()函式實現對陣列大小的求解,之後將長度值傳入函式,那麼函式中即可直到陣列的邊界,進行進一步的操作。

2.二維陣列

《c++ primer》中講解,c++中,二維陣列實際是一種特殊的一維陣列,即每乙個元素不是乙個數,而是乙個陣列。編譯器在對陣列進行處理時,a[3][4]中的乙個元素a[i][j]實際被認為是(a+i*4+j),而在記憶體中,資料實際是以行列的順序一維排列,因此,如果形參中沒有包含陣列的列資訊,函式將無法正確呼叫陣列,所以與一維陣列類似,最好在函式定義時,明確其大小空間,如下:

void fun(int a[4]);

void fun(int a[3][4]);

陣列的行數,不一定需要特別指出,但是列數不能忽略,如下的定義就是錯誤的:

void fun(int a);

總結

這麼一通下來,我覺得c++中並沒有很好的支援陣列的操作,函式呼叫的方式不知道為什麼不能直接傳入整個陣列,想起知乎上一位網友的說法,在c++中,能用string盡量不用char,能用vector盡量不用陣列,當時不太明白,現在想想,的確是這麼回事。

C 多維陣列傳參

void func int array 3 10 void func int array 10 兩種寫法都是合法的,不能把第二維或者更高維的大小省略,如 void func int array void func int array 3 這是由編譯器的原理限制的,對於陣列int array m n ...

強化C陣列作為函式引數 多維陣列的本質

include include include 多維陣列的本質就是乙個指標陣列,由於多維陣列高於3級的基本上沒有多大的意義 如果非要做3級以上的話,就是對二級的資料進行修改 int printf array01 char array 30 int len return 0 void printf03...

作為函式引數的多維陣列

c語言的陣列值得注意的地方有兩點 1 c語言中只有一維陣列,而且陣列的大小必須在編譯期就作為常數確定下來。然而,c語言中的陣列的元素可以是任何型別的物件,當然也可以是另外乙個陣列。這樣,要 出乙個多維陣列就不是一件難事。2 對於乙個陣列,我們只能夠做兩件事 確定該陣列的大小,以及獲得指向該陣列下標為...