Одномерные и многомерные(multidimensional) массивы или массив массивов(array of arrays) и их многомерное представление, также их объявление(declaration) и инициализация(initialization) с использованием автоматической инициализации неинициализированных элементов нулями(если инициализирован хотя бы один элемент), списка(list) инициализации и назначенных(designated) инициализаторов в C99: const int days[][constvar] = {31, [5][1] = 31, 30, 31, [1] = 29};
Индекс(с нуля) массива при инициализации должен быть константным целочисленным выражением(constant integer expression), состав производного(derived) типа, то есть массива(из скалярных(scalar) переменных) и границы(bounds), также поэлементное присваивание значений элементам массива(assigning array values), определение размера через sizeof(в байтах или элементах) и защита содержимого с помощью const
Значение идентификатора массива(arr == &arr[0] и &arr[0][0] == arr[0]), указательная реализация массива(((arr + 3)+2) == arr[3][2]), адресуемость по байтам(byte addressable) компьютера и элемент массива, как единица хранения(storage unit)
Передача одномерных и многомерных массивов как аргумент в сигнатуре функции(int foo(int [], int); или int foo(int [][constvar][constvar], int);), взаимозаменяемость(interchangeability) int * array и int array
Тип(определение единицы хранения), значение(адрес первого байта объекта) и арифметика указателей(переход по объектам), ещё приоритет и ассоциативность операторов *(разыменование) и ++(инкрементирование): *ptr++ == *(ptr++)
Операции(Operations) с указателями: присваивание(assignment), нахождение значения(value finding) или разыменование(dereferencing), взятие адреса(taking address), добавление и вычитание целого числа(adding and subtracting an integer), инкрементирование и декрементирование(incrementing and decrementing), разность(differencing) и сравнение(comparisons)
const с формальными параметрами, указатель на константу(const int * ptr или int const * ptr) и константный указатель(int * const ptr), вдобавок опасность(UB) разыменования неинициализированного указателя(Dereferencing an Uninitialized Pointer)
Указатель на указатель(pointer to pointer) пример двойной косвенности(double indirection), указатель на массив из нескольких элементов(int (* ptr)[n]), массив указателей(int * ptr[n]), совместимость указателей в ptrtofloat1 = ptrtofloat2 и небезопасность в С(Undefined Behavior), но не в С++(Error) присваивания константных неконстантным указателям(ptr = ptrtoconst) и присваивания вложенных(nested) указателей(ptrtoptrtoconst = &ptrtononconst; *ptrtoptrtoconst = &constvar; *ptrtononconst == constvar)
Массивы переменной длины(variable-length array or VLA) имеют автоматический класс хранения, инициализируются только после объявления и поддерживаются в C99, но не обязательно в C11: передача как параметр функции(int foo(int rows, int columns, int arr[rows][columns]); или int foo(int, int, int[][]);) и простое объявление int m = 2, n = 3, (* arr[m])[n];
Составные литералы(Compound Literals) будучи l-value и анонимными(не имеют идентификатора), сохраняются в памяти с автоматической или статической продолжительностью хранения и являются дополнением С99: (int[]){ 10, 20 * a, a + b }, (const char[5]){ "Hello" }
Язык программирования Си 6 издание. Стивен Прата
C Primer Plus 6th edition. Stephen Prata
Top comments (0)