2016-10-01 160 views
1

在我關於C++我有以下代碼示例教科書:混淆指向數組的指針作爲函數參數

using std::cout; 
    using std::endl; 
    int main() { 
     int aArr[4] = { 3,4,2,3 }; 
     int bArr[3] = { 2,3,1 }; 

     cout << "Append: " << endl; 
     printArray(aArr, 4); cout << " + "; printArray(bArr, 3); 
     int* cArr = append(&aArr, bArr); 
     cout << " = "; printArray(cArr, 7); cout << endl; 
     return 0; 


    } 

是否在呼叫中的「&」符號中的「aArr」前附加在主要是指傳遞了aArr的地址,或者傳遞了對aArr的引用。

該問題然後要求我實現一個函數追加,它接受兩個數組:第一個數組(在第一個參數中)大小爲4的數組指針和第二個數組(在第二個參數中)大小爲3的數組和指針返回到尺寸7的陣列I已宣佈的功能(在適當的頭文件)

int* append(int foo[4], int (&secondArray) [3]); 

曾撰文或許放錯位置的追加方法中的「&」符號的順序(即它應該在「bArr」之前)?

+1

&aArr和aArr是實際上,對於靜態數組特例同樣的事情。 –

+5

閱讀*參考*。在不同的情況下,會員意味着不同的事物。在變量聲明的上下文中(例如參數聲明),它不是地址運算符,而是表示變量是*引用*。 –

+6

@PierreEmmanuelLallemant不,他們事實上不是一回事! – Barry

回答

1

編譯器可以幫助你解決這種情況。

讓我們假設這是函數原型爲您的附加功能:

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 
+0

好的謝謝。假設我想循環遍歷foo中的元素,我該怎麼做。此代碼不起作用:for(int i = 0; i <4; i ++){* {foo [i]; \t} – IntegrateThis

+1

@JamesDickens'(* foo)[i]' –

+1

@ M.M lol夠了。感謝您的幫助順便說一句。 – IntegrateThis