[英]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::vector
或std::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.