簡體   English   中英

在 C++ 中將數組傳遞給函數

[英]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++ 標准的引用的答案。

這里發生了兩件事,數組參數被調整為指針參數數組參數被轉換為指針參數 這是兩種完全不同的機制,第一種是調整參數的實際類型,而另一種是標准轉換,它引入了指向第一個元素的臨時指針。

對函數聲明的調整:

dcl.fct#5 :

在確定每個參數的類型后,任何類型為“T 數組”(...) 的參數都被調整為“指向 T 的指針”。

所以int arg[]被調整為int* arg

函數參數的轉換:

conv.array#1

“NT 數組”或“T 的未知邊界數組”類型的左值或右值可以轉換為“指向 T 的指針”類型的純右值。 應用臨時物化轉換。 結果是指向數組第一個元素的指針。

所以在printarray(firstarray, 3); , 類型為“3 int 的數組”的左值firstarray被轉換為類型為“指向 int 的指針”的純右值(臨時),指向第一個元素。

當傳遞給printarray()時, firstarraysecondarray被轉換為指向 int 的指針。

printarray(int arg[], ...)等價於printarray(int *arg, ...)

但是,這不是 C++ 特有的。 C 對將數組名稱傳遞給函數具有相同的規則。

簡單的答案是數組總是通過引用傳遞,而 int arg[] 只是讓編譯器知道期望一個數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM