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()вычисляется на этапе компиляции, поэтому никакого влияния на скорость выполнения скетча он не оказывает.