【发布时间】:2023-03-09 08:04:02
【问题描述】:
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 也只是一个指向数组第一个元素的指针。那么这里有什么区别,为什么一个有效而另一个无效?
【问题讨论】:
-
与某些人所说的相反,数组不是指针。
-
"...a 也只是一个指向数组第一个元素的指针" 不,不,不...
a不是 指针-这是一个数组。ptr是一个指针,但days是一个数组 -
a是int[17]类型,编译器静态知道;这种类型在许多情况下衰变到int*,但不是全部,sizeof是非衰变情况之一。编译器一般不知道ptr指向什么。 (在这个例子中,优化编译器可能会推断它指向长度为 5 的数组days,但想象一下,如果ptr在初始赋值和sizeof ptr之间以各种复杂的方式发生变化。)
标签: arrays c pointers implicit-conversion