Программирование · 3 min read · Nov 15, 2025
Учебник по программированию на C для Linux Часть 20 - Арифметика адресов указателей

В нашем предыдущем уроке этой продолжающейся серии по программированию на C мы обсудили указатели немного подробнее. Продолжая эту тему, мы представляем вам несколько концепций, связанных с указателями. Итак, без лишних слов, давайте начнем.
Арифметика адресов указателей в C
Прежде всего, давайте сосредоточимся на арифметике адресов при работе с указателями. Как мы обсуждали в нашем предыдущем уроке, если у вас есть указатель, указывающий на массив (скажем, на его начало), очень легко получить доступ к элементам этого массива. Вот пример:
#include
int main()
{
char arr[]={'a','b','c','d'};
int a[]={1,2,3,4};
char *ptr = arr;
int *p = a;
for(int i=0; i Итак, в этом коде у нас есть два массива - ‘arr’ и ‘a’. Первый - это массив символов, а второй - массив целых чисел. Затем у нас есть два указателя, указывающих на эти массивы - ‘ptr’ и ‘p’, соответственно. Затем есть несколько циклов ‘for’, в которых мы выводим текущий адрес, на который указывает указатель, и значение, содержащееся по этому адресу.
Вот вывод этого кода на моем компьютере:
Указатель на символ указывает на 726409312, со значением a
Указатель на символ указывает на 726409313, со значением b
Указатель на символ указывает на 726409314, со значением c
Указатель на символ указывает на 726409315, со значением d
Указатель на целое число указывает на 726409296, со значением 1
Указатель на целое число указывает на 726409300, со значением 2
Указатель на целое число указывает на 726409304, со значением 3
Указатель на целое число указывает на 726409308, со значением 4Теперь, что примечательно здесь, так это адреса, напечатанные в выводе. Для массива символов добавление ‘1’ к указателю увеличивает его до следующего адреса, но для массива целых чисел добавление ‘1’ к указателю делает его прыжок на 4 адреса вперед. Почему так?
Ну, это зависит от типа указателя. Указатель на символ всегда прыгает на количество байтов, занимаемых символом, что обычно равно 1. Аналогично, указатель на целое число обычно прыгает на 4 байта при увеличении на 1. Так что это должно объяснить разницу в прыжках указателей на символы и целые числа в приведенном выше выводе.
Продолжая с арифметикой указателей, указатели могут использоваться в выражениях сравнения в некоторых случаях. Например, если вы хотите подтвердить, указывает ли указатель ‘ptr’ на элемент массива ‘arr’ (размером ‘size’), то вы можете сделать сравнение следующим образом:
if((ptr >= arr) && (ptr < (arr + size))) Таким образом, фактически, вышеуказанное выражение проверяет, является ли адрес, хранящийся в указателе, одним из его элементов.
Кроме того, если есть несколько указателей, указывающих на элементы одного и того же массива, вы можете использовать следующие операторы сравнения ==, !=, < и >=. На самом деле, вы также можете выполнять вычитание указателей в этих случаях. Вот пример:
#include
int main()
{
char arr[]= "Добро пожаловать на HowtoForge";
char *ptr = arr;
char *p = arr;
while(*p != '\0')
{
p++;
}
printf("\n Длина строки составляет %d", (p - ptr));
return 0;
} Итак, в этой программе мы убедились, что один указатель указывает на первый элемент массива, в то время как второй указатель постоянно увеличивается, пока не укажет на последний элемент (который равен ‘\0’ в постоянных строках).
Затем, учитывая, что мы имеем дело с символами (которые занимают по одному байту каждый), вычитая адрес, на который указывает первый указатель, из адреса, на который указывает второй указатель, мы можем найти количество символов, что, если вы посмотрите, является точной длиной строки.
ПРИМЕЧАНИЕ: Имейте в виду, что операции, такие как сложение, умножение, деление и другие, недопустимы, когда дело касается указателей. Также типы допустимых операций, которые мы перечислили до сих пор, также действительны только тогда, когда указатели одного типа и указывают на элементы одного и того же массива.
Заключение
После обсуждения основных концепций указателей в предыдущем уроке, мы расширили концепцию указателей, обсудив арифметику адресов указателей здесь. Мы рекомендуем вам практиковать все, что мы обсудили здесь, на вашем компьютере в виде программ. И если у вас есть какие-либо сомнения или вопросы, не стесняйтесь оставлять комментарий ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.