Получить длину массива с помощью указателя - PullRequest
5 голосов
/ 11 декабря 2011

Есть ли способ получить длину массива, если я знаю только указатель, указывающий на массив?

См. Следующий пример

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 - извините, я не "говорю" на реальном C).

Ответы [ 5 ]

12 голосов
/ 11 декабря 2011

Простой ответ - нет, вы не можете.Возможно, вы захотите сохранить переменную в памяти, которая хранит количество элементов в массиве.

И ответ на этот вопрос не так прост.Есть способ определить длину массива, но для этого вам нужно пометить конец массива другим элементом, таким как -1.Затем просто переберите его и найдите этот элемент.Положение этого элемента - длина.Однако это не будет работать с вашим текущим кодом.

Выберите один из вышеперечисленных.

4 голосов
/ 06 ноября 2015

Также здесь выполняется проект Arduino ... Кажется, все в Интернете настаивают на том, что это невозможно сделать ... и все же самый старый трюк в книге, похоже, прекрасно работает с массивами с нулевым символом в конце ...

пример для указателя на символ:

    int getSize(char* ch){
      int tmp=0;
      while (*ch) {
        *ch++;
        tmp++;
      }return tmp;}

magic ...

3 голосов
/ 11 декабря 2011
  • Вы можете определить длину массива, если у вас есть переменная массива.
  • Вы не можете определить длину массива, если у вас есть только указатель на него.
1 голос
/ 11 декабря 2011

Вы можете указать весь массив и НЕ указывать на первый элемент, например:

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) );
1 голос
/ 11 декабря 2011

Вы не можете и не должны пытаться определить длину массива, используя арифметику указателей

, если в C ++ используется векторный класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...