Программирование · 3 min read · Nov 18, 2025
Учебник по программированию на C для Linux Часть 19: Указатели и массивы

До сих пор в этой продолжающейся серии учебников по программированию на C мы кратко обсуждали основы указателей. Однако есть несколько других связанных с указателями концепций, которые необходимо обсудить. Поэтому в этом учебнике мы будем обсуждать концепцию указателей и массивов.
Прежде чем мы начнем с указателей и массивов, давайте быстро освежим основную концепцию самих указателей. Указатели — это особый вид переменных, которые могут хранить адреса. Например, указатель ‘ptr’ на символ может быть объявлен следующим образом:
char *ptr;И вы можете использовать знак амперсанда, чтобы сохранить адрес в нем. Вот пример:
char c = 'a';
ptr = &c;Теперь указатель ‘ptr’ содержит адрес переменной ‘c’. В качестве альтернативы, вы также можете сказать, что ‘ptr’ теперь указывает на переменную ‘c’.
Чтобы получить доступ или изменить значение переменной, на которую указывает указатель, вы можете использовать оператор *. Например, чтобы изменить значение переменной c с ‘a’ на ‘b’, вы можете использовать указатель ‘ptr’ следующим образом:
*ptr = 'b';Следующая программа должна дать вам лучшее представление о тех основных концепциях указателей, которые мы обсудили до сих пор:
#include
int main()
{
char c = 'a';
char *ptr = &c;
*ptr = 'b';
printf ("переменная c = %c", c);
return 0;
} Вот вывод этой программы:
переменная c = bИтак, вы можете видеть, что с помощью указателя значение переменной было изменено.
Указатели и массивы
Поскольку вы будете все больше времени проводить за написанием и чтением кода на C, вы заметите, что указатели и массивы часто используются вместе. Например, вы можете получить доступ к отдельным элементам массива, используя указатель. Рассмотрим следующий фрагмент кода:
...
...
...
char arr[] = {'a','b','c','d','e'}
char *ptr;
ptr = &arr[0]
...
...
...Здесь указатель ‘ptr’ указывает на первый элемент массива ‘arr’, который, если говорить с точки зрения индексов, находится на нулевой позиции массива. Теперь вы можете использовать оператор * с ‘ptr’, чтобы получить доступ/изменить значение, на которое указывает указатель.
Двигаясь дальше, как только у вас есть указатель, указывающий на первый элемент массива, легко получить доступ к другим элементам массива. Например, если - в контексте приведенного выше фрагмента кода - вы используете следующее выражение где-либо:
*(ptr+1)то это позволяет вам получить доступ ко второму элементу массива, что обычно делается следующим образом:
arr[1] Таким образом, по сути, добавление 1 к ‘ptr’ приводит к адресу следующего элемента в массиве, и с помощью * вы можете получить доступ к значению, хранящемуся по этому адресу. Аналогично, добавление 2 приведет вас к третьему элементу … и так далее.
Вот программа, которая должна дать вам более ясное представление о том, что мы только что обсудили:
#include
int main()
{
char arr[] = {'a','b','c','d','e'};
char *ptr = &arr[0];
for(int i=0;i И вот вывод:
arr[0] это a
arr[1] это b
arr[2] это c
arr[3] это d
arr[4] это eТаким образом, вы можете видеть, что выражение ‘*(ptr+i)’ - с i, варьирующимся от 0 до последнего индекса в массиве - позволило нам получить доступ ко всем элементам массива.
ПРИМЕЧАНИЕ 1: Имя массива, когда оно используется в коде, дает вам базовый адрес массива. Это означает, что имя массива и адрес его первого элемента — это одно и то же. Таким образом, в контексте массива ‘arr’, ‘&arr[0]’ и ‘arr’ — это одно и то же. Это распространяется и на другие элементы, что означает, что &arr[2] также можно записать как (arr+2) и так далее.
ПРИМЕЧАНИЕ 2: Расширяя то, что мы обсудили в примечании выше, каждое представление элемента массива может быть разбито на представление указателя. Например: arr[2] эквивалентно ‘*(arr + 2)’.
ПРИМЕЧАНИЕ 3: Хотя вы можете присвоить адрес массива указателю, обратное не является допустимым. Также, в отличие от указателей, вы не можете использовать операторы ++ или – с именем массива. В общем, вы не можете изменять адреса, по которым изначально расположены элементы массива.
Заключение
Этот учебник сосредоточился на концепции указателей и массивов, на том, как они связаны и как элементы массива могут быть доступны через указатели. В конце мы также обсудили некоторые важные моменты, касающиеся кода, который использует указатели на массивы.
Попробуйте эти концепции локально на своем компьютере, чтобы лучше понять, как это работает, и в случае возникновения каких-либо сомнений или вопросов оставьте комментарий ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.