簡體   English   中英

函數參數中的 C++ 數組指針

[英]C++ Array Pointer in Function Parameters

有人可以向我解釋這些功能如何/為什么相同嗎?

void doubleArray(int* values, int length)

void doubleArray(int values[], int length)

我無需更改任何內容即可使我的代碼仍然完全相同,但我不確定邏輯。 我希望至少必須更改函數中寫入的內容。 如果需要,完整代碼如下;

  #include <iostream>

    using std::cout;
    using std::endl;

void doubleArray(int* values, int length);

int main() {

    int length = 10;
    int values[length];

    for (int i = 0; i < length; i++){
        values[i] = i;
    }

    doubleArray(values, length);

    for (int i = 0; i < length; i++) {
      cout << values[i] << endl;
   }

}

void doubleArray(int* values, int length) {
    for(int i = 0; i < length; i++){
        values[i] = values[i] * 2;
    }
}

https://en.cppreference.com/w/cpp/language/function#Parameter_list

參數列表中每個函數參數的類型根據以下規則確定:

[..]

2) 如果類型是“T 的數組”或“T 的未知邊界數組”,則替換為“指向 T 的指針”類型

[..]

由於這些規則,以下函數聲明聲明了完全相同的函數:

 int f(char[]); int f(char* s); int f(char* const); int f(char* volatile s);

為什么它們是一樣的? 因為那是 C++ 的規則(它繼承自 C)。

C 的設計者認為能夠將數組傳遞給函數是一個壞主意。 他們認為最好將指針傳遞給數組的第一個元素。 有問題(在我看來)。

但他們也決定不想取消函數參數聲明中的數組語法。 因此他們決定,當用作函數參數時,數組形式T param[]只是編寫指針形式T* param的另一種方式。 如果您為數組指定大小(被忽略),它甚至是相同的, T param[10]也是一個指針。 更值得懷疑(在我看來)。

在 C++ 中,您可以通過使用std::vectorstd::array來避免這一切。 在 C 中,你就沒有那么幸運了。

假設我們聲明了一個int數組:

int values[10];

堆棧上分配了 10 個整數的內存塊,變量values包含該內存塊開頭的地址,或者換句話說,數組的第零個元素的地址,它們是相同的事物。

因此

&values[0] == values

永遠是真的。

類似地,這兩個語句正在處理相同的元素

cout << values[5];
cout << *(values + 5);

因此,如果我們有一個函數參數(或任何其他變量),它可以聲明為int*int[]並且兩者都將接受values ,因為這兩種聲明都只是聲明同一事物的替代方法 - 一個指針。 .

這可能會引起混淆,因為這兩個對foo()調用都是有效的:

void foo (int[] vals);

int values[10];
foo (values); // Passing an array

int x = 0;
int* px = &x:
foo (px);     // Passing a single object by address

所以作為一個風格問題,如果一個函數需要一個數組,它應該使用( int[] )的數組和一個長度。 如果它需要一個單一的對象,它應該采用一個指針( int* )。

暫無
暫無

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

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