Размер массива
У константы вроде COUNT есть слабое место: вам самим приходится согласовывать её с массивом. Если добавить в массив элемент и забыть про константу, цикл пропустит новый элемент. Если удалить элемент, цикл выйдет за конец массива. C умеет определять число элементов по самому массиву с помощью sizeof.
sizeof («размер») сообщает, сколько памяти занимает что-либо, в байтах. Байт — наименьшая единица памяти. Здесь один int занимает 4 байта, так что массив из пяти int занимает 20 байт. Если разделить размер всего массива на размер одного элемента, получится число элементов:
int scores[] = {80, 92, 75, 60, 88};
int count = sizeof(scores) / sizeof(scores[0]);
printf("%d\n", count);Это выведет:
5sizeof(scores) равно 20 — размер всего массива. sizeof(scores[0]) равно 4 — размер первого элемента. У всех элементов один тип, а значит, и один размер, поэтому 20 / 4 = 5 — это в точности число элементов. Так работает для массивов любого типа: double занимает 8 байт, но деление снова даёт число элементов.
Теперь цикл всегда соответствует массиву. Добавьте значение в массив, и count изменится сам:
int scores[] = {80, 92, 75, 60, 88, 95};
int count = sizeof(scores) / sizeof(scores[0]);
for (int i = 0; i < count; i++) {
printf("%d ", scores[i]);
}
printf("\n");Это выведет:
80 92 75 60 88 95Здесь часто делают две ошибки:
- Забывают про деление. Одно
sizeof(scores)равно 20 — это число байтов, а не элементов. Цикл до 20 выходит за конец массива и останавливается сRuntimeError: unreachable. - Выводят
sizeofсразу через%d.sizeofдаёт целое число другого типа, чемint, поэтомуprintf("%d\n", sizeof(scores) / sizeof(scores[0]));не компилируется:error: format specifies type 'int' but the argument has type '__size_t' (aka 'unsigned long'). Сначала сохраните результат в переменнойint, как в примерах выше.
Задание
- 1
Создайте переменную
countтипаintс числом элементов массиваprices. Вычислите его с помощьюsizeof, не пишите4. - 2
Напишите цикл
for, который проходит по индексам, пока они меньшеcount, и выводит каждую цену на отдельной строке с двумя знаками после запятой (%.2f):29.90,149.00,99.50и15.00. - 3
В магазин поступил новый товар. Добавьте пятую цену,
5.49, в конец массива, внутри фигурных скобок. Больше ничего не меняйте и запустите программу: цикл выводит и новую цену, потому чтоcountтеперь равно5.