使用指针获取数组的长度

时间:2011-12-11 14:21:52

标签: c arrays pointers arduino

当我只知道指向数组的指针时,有没有办法获取数组的长度?

请参阅以下示例

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”。

6 个答案:

答案 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讨论将是有用的。