使用指向它的指针查找数组的长度和数组的长度

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 也只是指向数组第一个元素的指针。那么这里有什么区别,为什么一个有效而另一个无效?

What I suppose is happening here is that ptr is just a normal 8-byte address pointing to the first element of the array, so it won't give us the real length of the array

你是对的。:)

But in the first example, sizeof(a), a is also just a pointer pointing to the first element of the array. So what is the difference here and why does one work but the other not?

数组指示符被转换为指向它们在表达式中第一个元素的指针,除非将它们用作运算符 sizeof 或运算符 &.

的操作数

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

所以在这个表达式中

sizeof(a)

数组a未转换为指针。

如果你会写例如

sizeof( a + 0 )

然后你会得到一个指针的大小。

在第一种情况下,您有一个数组。 sizeof(a) 给出存储它所需的字节数。

在第二种情况下,你有一个指针。 sizeof(ptr) 给出存储指针所需的字节数(取决于体系结构,通常为 4 或 8)。

编译器知道数组大小,但不知道有多少元素被指针指向。