[英]passing pointers (the name of array) into function in C/C++
假設我們創建了一個數組,例如:
int a[4]={1,2,3,4};
現在a
是該數組的名稱,指針也指向第一個元素a[0]
。 因此,當我想調用數組中的元素時,可以使用a[ i ]
或*(a+i)
。
現在我有一個功能:
void print_array(int* array, int arraySize){
for(int i=0; i<arraySize; i++){
cout<<*(array+i)<<endl;
cout<<array[i]<<endl;
}
}
當我使用print_array(a,4)
將a[4]={1,2,3,4}
傳遞a[4]={1,2,3,4}
此函數時,對於cout
的第一行,我完全理解,因為我使用*(a+i)
方法訪問數據和a
是我傳遞的指針。
我無法理解的是:因為我傳遞一個指針a
到功能,為什么我用a
格式為a[i]
一樣的第二行cout
? 是不是a
指針? 如果a
是指針,為什么a[i]
有效?
這使我整天困惑。 任何幫助都感激不盡!
因為實際上,盡管在數組上定義了下標運算符,但發生的事情是它們會衰減為用於運算的指針。
意思是如果a
是一個數組,從語義上會發生以下情況:
int b = a[i]; => int *__tmp = a; int b = *(__tmp + i);
但是,一旦運算符重載開始起作用,那么a[i] == *(a + i)
不再是真的。 甚至可能沒有定義右側。
C ++標准中的該引號將使這一點很清楚(5.2.1下標)
1后綴表達式和后跟方括號的表達式是后綴表達式。 其中一個表達式的類型應為“ T的數組”或“ T的指針” ,另一個表達式應為無范圍的枚舉或整數類型。 結果為“ T”類型。“ T”類型應為完全定義的對象類型。64表達式E1 [E2](通過定義)與*((E1)+(E2))相同[注:有關*和+的詳細信息,請參見5.3和5.7;有關數組的詳細信息,請參見8.3.4。 — [end note],除了在數組操作數的情況下,如果該操作數是左值則結果是左值,否則是x值。
a
是一個數組,而不是一個指針。 他們是不一樣的東西。 但是,名稱a
可以隱式轉換為指針(值為&a[0]
)。
例如;
int main()
{
int a[] = {1,2,3,4};
int *p = a; // p now has the value &a[0]
現在,在此部分代碼段之后,假設i
為整數值,則語言規則總計為;
a[i]
等效於*(a + i)
,后者等效於*(&a[0] + i)
p[i]
等於*(p + i)
現在,由於p
等於&a[0]
這意味着a[i]
, *(a + i)
, p[i]
和*(p + i)
都相等。
當調用print_arrat(a, 4)
其中a
是一個數組的名稱,然后a
總是被轉換到一個指針。 這意味着print_arrat()
總是傳遞一個指針。 這意味着print_arrat()
中的*(array + i)
與調用者中的a[i]
相同。
我無法理解的是:由於我將指針“ a”傳遞到函數中,為什么我可以像ac的第二行一樣以a [i]的格式使用“ a”?
因為為數組定義了下標運算符a[i]
,根據定義它等效於*(a+i)
。
在cout
行中,您使用array[i]
,其中array
是一個指針。 這也是允許的,因為還為指針定義了下標運算符。
“不是”指針嗎?
不, a
是一個數組。 array
是一個指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.