4 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
將數(shù)組類型傳遞給函數(shù)時(shí),會隱式轉(zhuǎn)換為指針類型。
所以,
void PrintSize(int p_someArray[10]) { printf("%zu\n", sizeof(p_someArray));}
和
void PrintSize(int *p_someArray) { printf("%zu\n", sizeof(p_someArray));}
是等價(jià)的。所以你得到的是價(jià)值sizeof(int*)

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
它是一個(gè)指針,這就是為什么它是一個(gè)常見的實(shí)現(xiàn),將數(shù)組的大小作為第二個(gè)參數(shù)傳遞給函數(shù)

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如其他人所說,當(dāng)用作函數(shù)參數(shù)時(shí),數(shù)組會衰減到指向第一個(gè)元素的指針。還值得注意的是,sizeof不評估表達(dá)式,并且在與表達(dá)式一起使用時(shí)不需要括號,因此您的參數(shù)實(shí)際上根本不被使用,因此您也可以使用類型而不是值來編寫sizeof。
#include <stdio.h>void PrintSize1 ( int someArray[][10] );void PrintSize2 ( int someArray[10] );int main (){ int myArray[10]; printf ( "%d\n", sizeof myArray ); /* as expected 40 */ printf ( "%d\n", sizeof ( int[10] ) ); /* requires parens */ PrintSize1 ( 0 ); /* prints 40, does not evaluate 0[0] */ PrintSize2 ( 0 ); /* prints 40, someArray unused */}void PrintSize1 ( int someArray[][10] ){ printf ( "%d\n", sizeof someArray[0] );}void PrintSize2 ( int someArray[10] ){ printf ( "%d\n", sizeof ( int[10] ) );}

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
因此,您需要將數(shù)組的長度作為第二個(gè)參數(shù)傳遞。當(dāng)您編寫代碼時(shí),您既要聲明一個(gè)常量大小的數(shù)組,然后將該數(shù)組傳遞給函數(shù),那么讓數(shù)組長度常量顯示在代碼中的幾個(gè)位置是很痛苦的...
K&R救援:
#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
所以現(xiàn)在你可以這樣做:
int a[10];...myfunction(a, N_ELEMENTS(a));
- 4 回答
- 0 關(guān)注
- 600 瀏覽
添加回答
舉報(bào)