簡體   English   中英

在C / C ++中將指針(數組的名稱)傳遞給函數

[英]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.

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