Case I:
int a[12];
printf("%d",sizeof(a));
Case II:
int *a = (int *)malloc(12*sizeof(int));
printf("%d",sizeof(a));
上面兩個代碼段返回不同的輸出在第一種情況下 有什麼INT之間*和int一個[大小]
4
在第二種情況下的差異,
48
這是爲什麼?
Case I:
int a[12];
printf("%d",sizeof(a));
Case II:
int *a = (int *)malloc(12*sizeof(int));
printf("%d",sizeof(a));
上面兩個代碼段返回不同的輸出在第一種情況下 有什麼INT之間*和int一個[大小]
4
在第二種情況下的差異,
48
這是爲什麼?
因爲數組不是指針,反之亦然。期。
詳細說明,如果是int a[12];
,a
是一個數組,它擁有它自己的屬性。它的類型是陣列的,所以當你經過陣列名sizeof
操作,它給你的陣列的大小(在你的情況下,12個int
S,乘以的int
,4大小,共48個) 。
OTOH,int *a = malloc(12*sizeof*a);
(更正格式),a
是一個指針,並使用這個sizeof
會給你只有指針本身的大小,分配(由指出)內存的指針沒有大小。
引述C-FAQ,第6章,
問:但是我聽說
char a[]
是相同的char *a
?答:沒有。 (你聽到的與函數的形式參數有關)。數組不是指針,儘管它們是密切相關的。
數組聲明
char a[6]
請求留出六個字符的空間,以名稱a
爲名。也就是說,有一個名稱爲a
的位置,可以放置六個字符。另一方面,指針聲明char *p
請求一個包含指針的地方,名稱爲p
。這個指針可以指向幾乎任何地方:任何char
,或任何連續的chars
數組,或無處。
注:
malloc()
and family in C
.。那段時間感覺非常強大:D Plus簡潔明瞭,但我相信這個問題可能是重複的。 – Transcendental
@超感謝。只希望_period_的價值能夠被所有人理解。 :) –
@SouravGhosh a [i]與*(a + i)禮相同嗎?那麼爲什麼他們不同的數據類型道歉,但解釋數組和指針的鏈接將是很好的幫助 – AAB
數組和指針在不同C.數據類型當陣列被用作與操作者sizeof
一個操作數,它給陣列數據類型的大小。但是,當指針與sizeof
運算符一起使用時,將返回指針的大小。
標準表示(C11-6.5.3。4):
運算符
sizeof
產生其操作數的大小(以字節爲單位),該操作數可以是表達式或類型的括號化名稱。 大小取決於操作數的類型。
類型在第一種情況下的操作數a
的是int [12]
而操作數在第二種情況下,類型是int *
。
您會得到不同的答案,因爲在這兩種情況下a
是不同的。
int a[12];
- 在這種a
是一個數組,
int *a = malloc(12*sizeof*a);
- 在這種a
是一個指針。
指針和數組可以互換最多的地方使用,但並不意味着他們是同樣的事情。兩者都有不同的屬性(如Sourav解釋)。
sizeof
運營商處理的尺寸爲類型。 它不需要對傳遞給它的操作數所持有的內容做任何事情。
int a[12]
作爲int [12]
類型,因此給出大小48(4*12)
。
但是int *a
是整數指針和sizeof
操作者給指針(即4
)的大小。
在這些情況下int a[12]
和int *a
都不相同。 請注意,sizeof
是少數情況下數組不衰減到指針之一。
請問[數組名是C中的一個指針嗎?](https://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c/1641963#1641963)使一個合適的重複?對'[c]數組指針'的搜索會產生33,000條左右的條目,這對搜索來說是一種痛苦。 –