3 回答

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊
一條特殊的C規(guī)則表示,對于函數(shù)參數(shù),數(shù)組類型將調(diào)整為指針類型。這意味著:
int length(int array[]);
相當(dāng)于
int length(int *array);
因此,當(dāng)您計算sizeof數(shù)組時,實際上是在計算指針的大小。
(C99,6.7.5.3p7)“參數(shù)聲明為“類型數(shù)組”應(yīng)調(diào)整為“類型的合格指針”,其中類型限定符(如果有)是在數(shù)組的[和]中指定的類型推導(dǎo)。”

TA貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊
正如其他答復(fù)者所指出的,聲明為采用數(shù)組的函數(shù)的編譯方式與采用指針的方式相同。
我見過的最常見的長度方法是使用#define,但是如果您使用模板玩弄技巧,則可以使函數(shù)起作用。
template <size_t _Size> inline int length(int(& array)[_Size])
{
//return sizeof(array) / sizeof(int);
return _Size;
};
int array[] = {1, 2, 3, 4};
printf("%d\n", length(array)); // print 4
對于長度為4的數(shù)組,此方法將被編譯為采用長度為4的數(shù)組并返回靜態(tài)4的方法。這還具有以下優(yōu)點:如果嘗試傳遞非數(shù)組的內(nèi)容,則編譯器將給出錯誤,而#define方法則沒有。
int* foo = array;
printf("%d\n", length(foo));
// error C2784: 'int length(int (&)[_Size])' : could not deduce template
// argument for 'int (&)[_Size]' from 'int *'
// test.cpp(56) : see declaration of 'length'

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
在主程序中,編譯器知道數(shù)組的長度。在子例程中,沒有。特別地,在子例程中,type int[]
的參數(shù)與type的參數(shù)相同int *
。另一方面,在主程序中,array
具有type int[4]
。(您可以通過嘗試向array
in 分配另一個值來進(jìn)行測試main
。編譯器會抱怨。)
- 3 回答
- 0 關(guān)注
- 506 瀏覽