Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Массив указателей в C
Отличайте массив адресов от указателя на массив и обращайтесь к объектам корректно.

int *p[3] объявляет массив из трёх указателей на int, а int (*p)[3] — указатель на массив из трёх целых. Скобки меняют группировку частей объявления и потому его смысл.
Перед разыменованием каждый элемент должен содержать действительный адрес. Объекты могут находиться в разных местах, но обязаны существовать всё время использования указателей. Для печати адреса через %p преобразуйте аргумент к void *.
Массив указателей на строки не является прямоугольной матрицей символов. Для указателей на литералы используйте const char * и не изменяйте сами литералы. Нарисуйте адреса и объекты, чтобы проверить понимание.
Код C
#include <stdio.h>
int main(void)
{
int first = 10;
int second = 20;
int third = 30;
int *items[] = {&first, &second, &third};
size_t count = sizeof items / sizeof items[0];
*items[1] = 25;
for (size_t i = 0; i < count; ++i) {
printf("items[%zu] points to %d\n", i, *items[i]);
}
printf("second is now %d\n", second);
return 0;
}Открыть в компилятореЧастые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.