Программирование · 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: Хотя вы можете присвоить адрес массива указателю, обратное не является допустимым. Также, в отличие от указателей, вы не можете использовать операторы ++ или – с именем массива. В общем, вы не можете изменять адреса, по которым изначально расположены элементы массива.

Заключение

Этот учебник сосредоточился на концепции указателей и массивов, на том, как они связаны и как элементы массива могут быть доступны через указатели. В конце мы также обсудили некоторые важные моменты, касающиеся кода, который использует указатели на массивы.

Попробуйте эти концепции локально на своем компьютере, чтобы лучше понять, как это работает, и в случае возникновения каких-либо сомнений или вопросов оставьте комментарий ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.