[英]Passing Arrays to Function in C++
#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;
}
這段代碼有效,但我想了解數組是如何傳遞的。
當從主函數調用printarray
函數時,將傳遞數組的名稱。 數組名是指數組第一個元素的地址。 這如何等同於int arg[]
?
語法
int[]
和
int[X] // Where X is a compile-time positive integer
完全一樣
int*
在函數參數列表中時(我省略了可選名稱)。
此外,當傳遞給函數(而不是通過引用傳遞)時,數組名稱衰減為指向第一個元素的指針,因此int firstarray[3]
和int secondarray[5]
衰減為int*
s。
當您使用相同的索引時,數組解引用和帶有下標語法(下標語法為x[y]
)的指針解引用都會產生相同元素的左值。
這三個規則結合起來使代碼合法並按您的預期工作; 它只是傳遞指向函數的指針,以及在數組衰減為指針后您無法知道的數組長度。
我只想添加這個,當你訪問數組的位置時
arg[n]
是相同的
*(arg + n)
表示從 de arg 地址開始的 n 偏移量。
所以arg[0]
將是*arg
這個問題已經得到了回答,但我想我會添加一個更精確的術語和對 C++ 標准的引用的答案。
這里發生了兩件事,數組參數被調整為指針參數,數組參數被轉換為指針參數。 這是兩種完全不同的機制,第一種是調整參數的實際類型,而另一種是標准轉換,它引入了指向第一個元素的臨時指針。
對函數聲明的調整:
在確定每個參數的類型后,任何類型為“T 數組”(...) 的參數都被調整為“指向 T 的指針”。
所以int arg[]
被調整為int* arg
。
函數參數的轉換:
“NT 數組”或“T 的未知邊界數組”類型的左值或右值可以轉換為“指向 T 的指針”類型的純右值。 應用臨時物化轉換。 結果是指向數組第一個元素的指針。
所以在printarray(firstarray, 3);
, 類型為“3 int 的數組”的左值firstarray
被轉換為類型為“指向 int 的指針”的純右值(臨時),指向第一個元素。
當傳遞給printarray()
時, firstarray
和secondarray
被轉換為指向 int 的指針。
printarray(int arg[], ...)
等價於printarray(int *arg, ...)
但是,這不是 C++ 特有的。 C 對將數組名稱傳遞給函數具有相同的規則。
簡單的答案是數組總是通過引用傳遞,而 int arg[] 只是讓編譯器知道期望一個數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.