[英]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
&arr
和arr
的區別在於前者的類型是指向數組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];
arr
和&arr[0]
具有指向 int ( int *
) 的類型指針&arr
具有指向五個元素 integer 數組的指針類型( int (*)[5]
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.