2013-01-13 119 views
41
#include <iostream> 
using namespace std; 

void printarray (int arg[], int length) { 
    for (int n = 0; n < length; n++) { 
     cout << arg[n] << " "; 
     cout << "\n"; 
    } 
} 

int main() 
{ 
    int firstarray[] = {5, 10, 15}; 
    int secondarray[] = {2, 4, 6, 8, 10}; 
    printarray(firstarray, 3); 
    printarray(secondarray, 5); 

    return 0; 
} 

此代碼有效,但我想了解如何傳遞數組。傳遞數組在C++中的功能

當從主函數調用printarray函數時,數組的名稱被傳遞。數組的名稱引用數組的第一個元素的地址。這如何等於int arg[]

+0

只是具體而言,數組的名稱引用數組。它可以轉換爲指向第一個元素的指針,這在大多數情況下會發生。 –

回答

20

的語法

int[] 

int[X] // Where X is a compile-time positive integer 

是完全一樣的

int* 

當在函數參數列表(我離開了可選的名稱)。

此外,陣列名稱衰減到指針時傳遞給功能(而不是通過引用傳遞)的第一個元素,從而既int firstarray[3]int secondarray[5]衰變到int*秒。

同樣發生的情況是,當您使用相同的索引時,數組解引用和帶下標語法的指針解引用(下標語法爲x[y])會在同一個元素上產生左值。

這三條規則相結合,使代碼合法,並按照您的期望工作;它只是傳遞指向函數的指針,以及在數組衰減到指針後數組的長度。

+8

絕對錯誤。 'int []'和'int [X]'是數組類型,它們保持這種狀態。指向數組的指針衰減是指將數組類型的變量隱式轉換爲第一個元素的指針,如果這是預期的。這個函數聲明會發生什麼是完全不同的 - 函數參數的類型被調整爲它的第一個元素的指針 - 這不是一個指針衰減的數組。我不知道爲什麼沒有人告訴過你。 – AnArrayOfFunctions

+0

請教育你自己並閱讀[this](https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/hwQWZ_uvXDI) – AnArrayOfFunctions

+0

這個答案的前半部分是錯誤的。 'int [X]'參數與'int *'不同。 – Navin

7

firstarraysecondarray轉換爲指向int的指針時,傳遞給printarray()

printarray(int arg[], ...)相當於printarray(int *arg, ...)

然而,這不是特定於C++。 C將數組名稱傳遞給函數的規則相同。

10

我只是想補充這一點,當你訪問數組的位置一樣

arg[n]

相同

*(arg + n) 比是指N從德ARG地址開始的偏移。

所以arg[]*arg

0

的問題已經回答了,但我想我會添加一個答案用更精確的術語和引用到C++標準。

兩件事情都在這裏繼續,陣列參數被調整到指針參數,和數組參數被轉換爲指針參數。這是兩個完全不同的機制,第一個是對參數實際類型的調整,而另一個是標準轉換,它引入了第一個元素的臨時指針。

調整到您的函數聲明:

dcl.fct#5

確定每個參數的類型,類型(...)「T的數組」的任何參數之後被調節爲「指向T」。

因此int arg[]調整爲int* arg

轉換的函數的參數的:

conv.array#1

左值或類型「數組NT的」或「結合的T未知的數組」的右值可以被轉換成的prvalue鍵入「指向T的指針」。臨時實現轉換已應用。結果是一個指向數組的第一個元素的指針。

所以在printarray(firstarray, 3);,左值類型「陣列3爲int」的firstarray被轉換爲prvalue類型的(臨時)「指針爲int」,指向第一個元素。