当我只知道一个指向数组的指针时,有没有办法获取数组的长度?
技术上是的,有一种方法可以让代码有一个真正的指向数组的指针,因为数组大小的类型与int (*array_pointer)[3] 相同。
这与 OP 的代码不同,因为指针 point不是指向数组的指针,而是 pointer to an int。
point = testInt; 行转换数组testInt 到数组的第一个元素的地址(这是一个int *)并将其分配给point。因此数组大小信息丢失了。
int testInt[3];
testInt[0] = 0;
testInt[1] = 1;
testInt[2] = 1;
int* point;
point = testInt; // Get the address of testInt[0]
int (*array_pointer)[3] = &testInt; // Get the address of the array
printf("%zu\n", sizeof(testInt) / sizeof(int));
printf("%zu\n", sizeof(point) / sizeof(int));
printf("%zu\n", sizeof(*point) / sizeof(int));
printf("%zu\n", sizeof(*array_pointer) / sizeof(int));
printf("%p\n", (void *) testInt);
printf("%p\n", (void *) point);
printf("%p\n", (void *) array_pointer);
样本输出
3
2
1
3
0xffffcbc4
0xffffcbc4
0xffffcbc4
指针point 和array_pointer 都有指向内存中相同位置的值,但指针的类型不同。
使用支持可变长度数组的 C99 或更高版本,代码可能如下所示,并且无需在指针定义中显式编码 3 即可获得类似的结果。
int (*array_pointer_vla)[sizeof testInt/sizeof testInt[0]] = &testInt;
printf("%zu\n", sizeof(*array_pointer_vla) / sizeof(int));
输出
3
我现在看到与@user411313 答案的相似之处。也许更深入的解释和 VLA 讨论会很有用。