当我只知道指向数组的指针时,有没有办法获取数组的长度?
请参阅以下示例
int testInt[3];
testInt[0] = 0;
testInt[1] = 1;
testInt[2] = 1;
int* point;
point = testInt;
Serial.println(sizeof(testInt) / sizeof(int)); // returns 3
Serial.println(sizeof(point) / sizeof(int)); // returns 1
(这是来自Arduino Code的一小部分内容 - 对不起,我不会说“真正的C”。
答案 0 :(得分:12)
简单的答案是否定的,你不能。您可能希望在内存中保留一个变量来存储数组中的项目数量。
这是一个不太容易的答案。有一种方法可以确定数组的长度,但为此你必须用另一个元素标记数组的末尾,例如-1
。然后循环遍历它并找到这个元素。该元素的位置是长度。但是,这不适用于您当前的代码。
选择以上其中一项。
答案 1 :(得分:4)
在这里做一个Arduino项目...... 互联网上的每个人似乎都坚持认为这是不可能的...... 然而,本书中最古老的技巧似乎与空终止数组一样正常......
char指针示例:
int getSize(char* ch){
int tmp=0;
while (*ch) {
*ch++;
tmp++;
}return tmp;}
...魔
答案 2 :(得分:3)
答案 3 :(得分:1)
您不能并且不应尝试使用指针算法推导数组长度
如果在C ++中使用向量类
答案 4 :(得分:1)
如果指向整个数组并且NOT指向第一个元素,则可以:
int testInt[3];
int (*point)[3];
point = testInt;
printf( "number elements: %lu", (unsigned long)(sizeof*point/sizeof**point) );
printf( "whole array size: %lu", (unsigned long)(sizeof*point) );
答案 5 :(得分:0)
当我只知道一个指向数组的指针时,是否有一种获取数组长度的方法?
从技术上讲,是的,当代码具有与int (*array_pointer)[3]
相同类型的数组时,有一种方法可以使代码具有指向数组的真正指针。
这与OP的代码不同,因为指针point
不是指向数组的指针,而是pointer to an int
。
行point = testInt;
将数组testInt
转换到数组的第一个元素(即int *
)的地址,并将其分配给{ {1}}。因此,数组大小信息将丢失。
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
都具有指向内存中相同位置的值,但是指针的 type 类型不同。
对于支持可变长度数组的C99或更高版本,无需在指针定义中明确编码3即可实现下面的代码并获得类似的结果。
array_pointer
输出
int (*array_pointer_vla)[sizeof testInt/sizeof testInt[0]] = &testInt;
printf("%zu\n", sizeof(*array_pointer_vla) / sizeof(int));
我现在看到与@user411313答案的相似之处。也许更深入的解释和VLA讨论将是有用的。