Главная chevron_right Переменные и константы chevron_right Утилиты chevron_right sizeof()

sizeof()

sizeof() возвращает размер переменной, типа или массива в байтах — удобно для циклов, которые автоматически подстраиваются при изменении массива.

Полная статья

Описание

sizeof() — это оператор языка C/C++, который возвращает размер переменной, типа данных или массива в байтах. В отличие от обычной функции, он чаще всего вычисляется прямо во время компиляции, без затрат на выполнение.

Главная польза sizeof() в Arduino-скетчах — работа с массивами: не нужно вручную считать элементы и запоминать их количество в отдельной переменной. Если вы позже добавите или уберёте элементы из массива, цикл на основе sizeof() автоматически подстроится под новый размер.

Синтаксис

    sizeof(variable)
    sizeof(type)

Параметры

variable: переменная, массив или тип данных, размер которого нужно узнать. Например: int, float, byte.

Возвращает

Размер в байтах. Тип результата: size_t.

Пример кода

Программа ниже печатает строку посимвольно. sizeof(myStr) возвращает полный размер массива myStr в байтах, включая завершающий нулевой символ '\0'. Именно поэтому в условии цикла стоит sizeof(myStr) - 1 — чтобы нулевой символ не попал в вывод.

    char myStr[] = "this is a test";

    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      for (byte i = 0; i < sizeof(myStr) - 1; i++) {
        Serial.print(i, DEC);
        Serial.print(" = ");
        Serial.write(myStr[i]);
        Serial.println();
      }
      delay(5000);  // замедляем программу
    }

Размер массива

Когда элементы массива занимают больше одного байта (например, int или float), sizeof(array) возвращает суммарный размер всего массива в байтах, а не количество элементов. Чтобы получить именно количество элементов, используют такое деление:

    int myValues[] = {123, 456, 789};

    // этот цикл for работает корректно с массивом любого типа и размера
    for (byte i = 0; i < (sizeof(myValues) / sizeof(myValues[0])); i++) {
      // делаем что-то с myValues[i]
    }

Формула sizeof(myValues) / sizeof(myValues[0]) универсальна: она делит общий размер массива на размер одного его элемента и работает для массивов любого типа.

Практические замечания

  • Для строк в стиле C размер массива включает завершающий символ '\0', поэтому при переборе символов используйте sizeof(myStr) - 1, а не просто sizeof(myStr).
  • Если передать массив в функцию как параметр, внутри функции он превращается в указатель. В этом случае sizeof() вернёт размер указателя (обычно 2 или 4 байта), а не размер исходного массива. Чтобы избежать путаницы, передавайте размер массива отдельным параметром.
  • Для локальных и глобальных массивов фиксированного размера sizeof() — надёжный способ избавиться от «магических чисел» в циклах и условиях.
  • Если вы изменили тип элементов массива (например, с int на long), формула sizeof(myValues) / sizeof(myValues[0]) автоматически даст правильный результат — пересчитывать вручную ничего не нужно.
  • sizeof() вычисляется на этапе компиляции, поэтому никакого влияния на скорость выполнения скетча он не оказывает.

Полезные материалы