簡體   English   中英

傳遞 &arr(整個塊的地址)或僅傳遞數組名稱(第一個元素的地址)有什么區別嗎?

[英]Is there any difference in passing &arr(address of entire block) or just passing name of array (address of first element)?

void func1(int* ptr)
{
    printf("func1 :%d\n",++ptr);
}

int main()
{
    int arr[4] = {0,1,2,3};
    printf("Addr enter code here`f arr: %d\n",arr);
    func1(arr);  // first way:
    func1(&arr); // second way: How this will be different from func1(arr). 
}

[顯示代碼運行的圖像][1] [1]:https://i.stack.imgur.com/Prvii.png

&arrarr的區別在於前者的類型是指向數組int (*)[4]的指針,而后者的類型是數組int[4]可以衰減為指向第一個元素int*的指針。 指向數組的指針和指向第一個元素的衰減指針都指向相同的地址,因為數組的第一個字節也是數組第一個元素的第一個字節。

func1(&arr)func1(arr)之間的區別在於前者的格式不正確,因為int (*)[4]不會隱式轉換為int* 為了能夠調用func1(&arr) ,您必須接受正確類型的指針:

void func1(int (*ptr)[4])

 printf("func1:%d\n",++ptr); printf("Addr enter code here`f arr: %d\n",arr);

這兩個調用都會導致未定義的行為。 可變參數的類型必須與格式說明符所需的類型相匹配。 您使用了格式說明符%d ,它要求參數是int類型(或類似類型)。 這里(衰減)參數的類型是int* ,它不是int

我們有一個名為func1的 function ,它接受一個指向int的指針,也就是說,它的參數是int* 現在讓我們看看每種情況下發生了什么。

案例一

在這種情況下,我們有func1(arr);

這里變量arr是一個大小為 4 的數組,其元素類型為int (即int [4] ),但由於類型 decay ,它衰減指向第一個元素(即int* )的指針。

所以當你寫的時候,

func1(arr);

本質上,您將int*作為與 function參數的類型匹配參數傳遞。

案例二

在這種情況下,我們有func1(&arr);

這里&arr表示指向大小為 4 且元素類型為int的數組的指針。(即int (*)[4] )。

現在你寫的時候,

func1(&arr);

本質上,您將int (*)[4]作為參數傳遞給 function func1 但請注意func1參數int*類型。 所以參數和參數的類型不匹配

現在在您發布的屏幕截圖中,該程序似乎正在編譯並成功執行。 但請注意,由於在第二種情況下,參數和參數類型不匹配,您將獲得未定義的行為

未定義的行為意味着任何1都可能發生,包括但不限於給出您預期的 output 的程序。 永遠不要依賴具有未定義行為的程序的 output。


1有關未定義行為的更技術上准確的定義,請參見此處提到:對程序的行為沒有限制

Arrays 衰減到指針。 這些指針中的任何一個都引用 memory 中的相同地址。 區別在於 this 指針的類型。

int arr[5];
  1. arr&arr[0]具有指向 int ( int * ) 的類型指針
  2. &arr具有指向五個元素 integer 數組的指針類型( int (*)[5]

暫無
暫無

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

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