我正在研究C中的最後一個明天,並且對於運算符sizeof有個問題。sizeof數組澄清
比方說,int
的大小是32
位,指針是64
位。
如果有一個功能:
int
foo (int zap[])
{
int a = sizeof(zap);
return a;
}
因爲zap
是一個指針,foo
將返回8
,因爲這是多少個字節如何需要存儲這個特殊的指針。然而,用下面的代碼:
int zip[] = { 0, 1, 2, 3, 4, 5 };
int i = sizeof(zip);
i
將6 * sizeof(int)
= 6 * 4
= 24
爲什麼是它的每個元素的元素的sizeof(zip)
返回數倍大小,而sizeof(zap)
返回a的大小指針?是不是zap
的大小不明確,zip
不是?編譯器知道zip
是6
元素,但不知道可能有多大。
數量並不被編譯器忽略,INT X [4]作爲函數參數意味着你必須通過的_exactly_ 4個元素的數組的指針。這與在代碼中其他地方寫入'int(* x)[4]'是一樣的。除此之外,這個答案指出了這個問題:參數的數組語法與程序中其他地方聲明的數組具有不同的含義。它是C語言的「特徵」之一。爲避免混淆,請始終使用「int * x」表示法來表示參數。 – Lundin 2011-05-09 06:56:59
您可以指出它在標準中寫入括號內的數字必須等於傳遞數組的大小嗎?提示:考慮到你根本不能傳遞一個數組並且該函數實際上只接收一個指針,這將是一個奇怪的要求。當調用用'FOO的函數(巴)'其中'bar'是一個數組,數組已被轉換爲指針**即使對於編譯器**被認爲是函數調用之前。對轉換中已經放棄的尺寸信息施加限制是沒有意義的。 – 6502 2011-05-09 07:06:29
@Lundin,對於數組參數的第一維,no基本上被忽略。此外,C99還有關鍵字'static'的可能性,以指定該函數對於項目至少*。但參數的類型仍然是'int *'。 – 2011-05-09 07:51:45