編譯器可以幫助你解決這種情況。
讓我們假設這是函數原型爲您的附加功能:
int* append(int foo[4], int (&secondArray) [3]);
我可以用這個代碼簡單的位測試了這一點:
int* append(int foo[4], int (&secondArray) [3])
{
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 2,3,1 };
int* cArr = append(&aArr, bArr);
return 0;
}
但是編譯器不喜歡這,失敗與此錯誤:
test.cpp(9): error C2664: 'int *append(int [],int (&)[3])':
cannot convert argument 1 from 'int (*)[4]' to 'int []'
正如你可以看到它不喜歡&aArr
參數1在第9行,因爲它與第1行的函數定義的參數1不匹配。從錯誤消息來看,它甚至足以給出它認爲它們不排隊的原因。
現在使用從編譯器的提示很明顯的作用其實應該是這樣的:
int *append(int (*foo)[4], int secondArray[3])
{
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 2,3,1 };
int* cArr = append(&aArr, bArr);
return 0;
}
與該改變的編譯器是樂於接受的代碼是正確的。
現在比較兩者,你可以看到不同之處在於第一種情況下第一個參數是以4個整數數組的形式傳遞的,而在第二種情況下它是作爲四個整數數組的地址傳遞的。
只是從英語你可以告訴這些是兩個完全不同的東西。
編輯:下面是該示例的擴展,顯示如何訪問函數內的數據。
#include <stdio.h>
int *append(int (*foo)[4], int secondArray[3])
{
int *foo1 = *foo;
for (int i = 0; i < 4; ++i)
{
printf("foo: %d\n", foo1[i]);
}
for (int j = 0; j < 3; ++j)
{
printf("secondArray: %d\n", secondArray[j]);
}
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 12,13,11 };
int* cArr = append(&aArr, bArr);
return 0;
}
編譯的運行此代碼生成以下輸出:
foo: 3
foo: 4
foo: 2
foo: 3
secondArray: 12
secondArray: 13
secondArray: 11
&aArr和aArr是實際上,對於靜態數組特例同樣的事情。 –
閱讀*參考*。在不同的情況下,會員意味着不同的事物。在變量聲明的上下文中(例如參數聲明),它不是地址運算符,而是表示變量是*引用*。 –
@PierreEmmanuelLallemant不,他們事實上不是一回事! – Barry