Я видел этот код:
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
Я знаю, что uint8_t
содержит байт, так как же эта строка кода работает, когда один
элемент 0xFF
сам по себе представляет собой один целый байт, поэтому ширина массива составляет 6 байт.
Может ли кто-нибудь объяснить, почему 6 байтов данных имеют однобайтовый тип?
Чтобы попробовать это проверить, я написал этот код на Arduino Uno R3:
void setup() {
Serial.begin(115200);
// #include <stdint.h> // Not needed in Arduino IDE with Arduino board selected.
// #include <stdio.h> // Not needed in Arduino IDE with Arduino board selected.
}
void loop() {
delay(3000);
uint8_t numbers[] = {0xFF, 0x22, 0xA0, 0x3B, 0xC2}; // 5 elements & 5 bytes
Serial.print("sizeof(numbers) ");
Serial.println(sizeof(numbers)); // outputs = 5, (obviously the # elements in array)
for (int i = 0; i <= 8; i++) {
Serial.print("sizeof(numbers[");
Serial.print(i);
Serial.print("]: ");
Serial.println(sizeof(numbers[i])); // outputs 1 for i=0 to 8! Element value vanished! non-used elements positions equate to same as used element positions
}
}
uint8_t
тип — 1 байт. Размер массива uint8_t
равен 1 * количество элементов. sizeof(numbers)
— размер массива. И, кстати, можно написать sizeof numbers
. Круглые скобки необходимы только для sizeof
типа данных, например. sizeof (int)
но sizeof my_variable
.
Если вы выполните Serial.println(sizeof(numbers)) он напечатает 5.
увидел этот код: uint8_t BroadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
Я знаю, что uint8_t содержит байт, так как же эта строка кода работает, когда один элемент 0xFF сам по себе представляет собой один целый байт, а массив следовательно, ширина 6 байт.
broadcastAddress
— это не uint8_t
, а скорее массив из uint8_t
([]
делает его массивом).
Поэтому он может содержать несколько элементов типа uint8_t
.
.
Компилятор определит фактический размер массива на основе инициализатора ({0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
) — т. е. в данном случае 6.
То же самое относится и к numbers
в вашем тестовом коде (с 5 элементами).
Для sizeof
не имеет особого значения, к какому «значению» вы его примените. Имеет значение только тип.
Когда у тебя есть
uint8_t foo[5];
каждый элемент foo
имеет тип uint8_t
и это все, что заботит sizeof
. Он даже не учитывает, какой именно элемент вы используете: это просто элемент foo
sizeof foo[-1] // all
sizeof foo[1000] // good
Точно так же, когда делятся два целых числа, полученное значение имеет тип int
.
sizeof (1000/3)
sizeof (42/0) // ok, sizeof just sees an int resulting from dividing 2 ints
В комментарии написано, что
numbers[]
— это 5 элементов. Компилятор подсчитает значения и заполнит правильное число внутри[]
, превратив его в массив.