簡體   English   中英

sizeof()如何通過引用參數傳遞

[英]how sizeof() works in pass by reference arguments

我將數組傳遞給函數,並試圖找到數組的長度。 但結果出乎意料。 有人可以解釋嗎?

int main()
{
     int array[10]={0};
     func(array);
     return 0;
}
void func(int arr[])
{
    printf("length of an array is %d ",(sizeof(arr)/sizeof(arr[0]));
}

它給出了答案2.當我在main函數中嘗試相同的操作時,它工作正常(答案為10)。 //在Linux中使用gcc編譯器

在我看來,造成此結果的原因是sizeof(arr) == 8 (PC上指針的大小)和sizeof(arr[0]) == 4因為它是整數,因此是8/4==2

該聲明: void func(int arr[])告訴函數將指向int的指針作為參數。

我不清楚是否可以通過引用來計算數組的sizeof 接受數組引用作為參數的C函數總是傾向於也接收其長度作為參數。

main()函數的區別在於main array內部變量的類型為int[10] ,因此sizeof可以獲取其長度(以字節為單位)。 funcarr的類型為int*因此sizeof僅提供指針的字節長度。

您正在發送和接收數組標兵,而不是數組。

在發送arg ::時

func(array[10]);

收到arg時:

void func(int array[10])

但是發送總數組不是很好。 因此,發送和接收如下參數。

func(array, arry_size);  //function call
void func(int array[], int length)  //defin

您必須記住,數組會衰減到指針。 這意味着在函數func ,變量arr實際上不是數組,而是指針。 對指針執行sizeof返回指針的大小,而不是其指向的大小。

之所以得到結果2是因為您使用的是64位指針(即8個字節)的64位系統,將其除以int的大小(即4個字節)就得到了結果2

sizeof(arr)

是指針的大小,而不是arr指向的塊的大小。

當您將數組作為參數傳遞給函數時,該數組會衰減為指向數組開頭的指針。 與數組不同,指針中沒有存儲任何元信息。 好的做法是將大小作為附加參數傳遞給函數。

void func(int *arr, int size);

這就是C標准所說的內容(C99 6.3.2.1/3-其他操作數-左值,數組和函數指示符):

除非它是sizeof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則將類型為“ array of type”的表達式轉換為類型為“ pointer to to”的表達式類型'',它指向數組對象的初始元素並且不是左值

因此,一旦將其傳遞給函數-在函數內部,它不再是數組,而是指針。

sizeof()運算符返回數據類型的大小。 這里的int大小是兩個。

暫無
暫無

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

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