[英]Finding length of array and length of array with pointer pointing to it
int a[17];
size_t n = sizeof(a) / sizeof(int);
在 C 中,最常見的是找到這樣的數組長度,這很清楚。 但我的問題是以下內容不起作用:
int days[] = {1,2,3,4,5};
int *ptr = days;
size_t n = sizeof(ptr) / sizeof(int);
我想這里發生的是 ptr 只是一個普通的 8 字節地址,指向數組的第一個元素,所以它不會給我們數組的實際長度。 但在第一個例子中,sizeof(a), a 也只是一個指向數組第一個元素的指針。 那么這里有什么區別,為什么一個有效而另一個無效?
我想這里發生的是 ptr 只是一個普通的 8 字節地址,指向數組的第一個元素,所以它不會給我們數組的實際長度
你說的對。:)
但在第一個例子中,sizeof(a), a 也只是一個指向數組第一個元素的指針。 那么這里有什么區別,為什么一個有效而另一個無效?
數組指示符轉換為指向表達式中第一個元素的指針,除非將它們用作運算符sizeof
或運算符&
的操作數。
來自 C 標准(6.3.2.1 Lvalues、arrays 和 function 代號)
3 除非它是 sizeof 運算符或一元 & 運算符的操作數,或者是用於初始化數組的字符串字面量,否則類型為 ''array of type'' 的表達式將轉換為類型為 ''pointer 的表達式鍵入指向數組 object 的初始元素且不是左值的''。 如果數組 object 具有寄存器存儲 class,則行為未定義。
所以在這個表達式中
sizeof(a)
數組a
未轉換為指針。
如果你會寫例如
sizeof( a + 0 )
然后你會得到一個指針的大小。
在第一種情況下,您有一個數組。 sizeof(a) 給出存儲它所需的字節數。
在第二種情況下,您有一個指針。 sizeof(ptr) 給出存儲指針所需的字節數(取決於架構,通常為 4 或 8)。
編譯器知道數組大小,但不知道一個指針指向多少個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.