簡體   English   中英

C語言中的數組和函數

[英]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中的數組要記住的兩件事:

  1. 除非它是sizeof或一元&運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字,否則類型為“ T N元素數組”的表達式將替換為(“ decay to” )類型為“ T指針”的表達式,其值是數組第一個元素的地址。

  2. 在函數參數聲明的上下文中, 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.

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