簡體   English   中英

使用指向它的指針查找數組的長度和數組的長度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM