Давайте рассмотрим простой код в системе, где целые числа имеют длину четыре байта:
int xyzzy[] = {3,1,4,1,5,9,2,6,5,3,5,8,9}; // 13 integers
printf ("%d\n"", sizeof(xyzzy)); // 13 * 4 = 52
printf ("%d\n"", sizeof(int)); // 4
printf ("%d\n"", sizeof(xyzzy) / sizeof(int)); // 52 / 4 = 13
В соответствии с последней строкой этот расчет позволяет получить количество элементов в массиве.
В сторону, я предпочитаю конструкцию:
sizeof(xyzzy) / sizeof(*xyzzy)
, поскольку это продолжит работать, даже если я, например, поменяю тип xyzzy
на double
. Это означает, что мне нужно только изменить строку one , в которой объявлена переменная, а не искать все вычисления размера.
На самом деле у меня даже есть любимый макрос для этого:
#define numof(x) (sizeof(x) / sizeof(*x))
чтобы сделать мой код немного меньше.
С точки зрения того, что именно делает цикл for
(и, кстати, технически это не второй цикл for
, поскольку есть только один, но является вторым циклом), он в основном перебирает все значения i
(начиная с 0, первый индекс), пока не достигнет либо точки за последним элементом, либо не найдет элемент с требуемым кодом элемента.
При выходе из этого цикла, i
будет установлен на количество элементов, если код элемента не был найден, или на правильный индекс, если он был найден, следовательно, if
оператор, следующий за for
loop.