[英]Arrays and functions in c language
如果我有以下內容,我有什么我不明白的:
double average (double scores[]){
double sum = 0;
int n;
int nscores = sizeof(scores)/sizeof(double);
for (n=0 ;n<nscores ;++n){
sum+=scores [n];
return sum/nscores;
}
我發送此函數這樣的數組:
double scores[3]={1,2,3};
為什么sizeof(scores)將為0?
函數內部的sizeof(scores)
等效於sizeof(double *)
:此時編譯器無法判斷數組的大小。
它不會為零,但是因為sizeof(scores)
和sizeof(double)
都是整數類型的表達式,所以sizeof(scores)/sizeof(double)
是整數除法,因此,如果sizeof(scores) < sizeof(double)
,然后sizeof(scores)/sizeof(double) == 0.
這是因為數組作為函數的參數被視為指針。 例如,
double average (double scores[]);
...相當於:
double average (double *scores);
因此sizeof(scores)/sizeof(double)
等於sizeof(double *)/sizeof(double)
,並且如果您碰巧這些類型具有相同的大小,則結果為1
,但是如果double的大小是8,指針剛好是4,則結果是0
。
關於C中的數組要記住的兩件事:
除非它是sizeof
或一元&
運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字,否則類型為“ T
N元素數組”的表達式將替換為(“ decay to” )類型為“ T
指針”的表達式,其值是數組第一個元素的地址。
在函數參數聲明的上下文中, T a[]
和T a[N]
等於T *a
; IOW, a
被聲明為指向T
的指針,而不是數組。 請注意,這僅適用於函數參數聲明。
當您從主函數調用average(scores)
,表達式scores
將被另一個double *
類型的表達式替換,因此average
接收的是指針值,而不是數組。 因此,用於獲取元素數量的sizeof
技巧在average
函數內不起作用。 您將必須將scores
的元素數量作為單獨的參數傳遞,如下所示:
double average(double *scores, size_t count)
{
...
}
並稱其為
average(scores, sizeof scores / sizeof *scores); // or pass a constant 3, or
// something similar.
scores
是* const的兩倍,因此sizeof(scores)
將是存儲指針所需的大小
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.