Поиск по сайту:

Учебник по программированию на C для Linux. Часть 20. Арифметика адреса указателя


На этой странице

  1. Арифметика адреса указателя в C
  2. Заключение

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

Арифметика адреса указателя в C

Во-первых, давайте сосредоточимся на адресной арифметике при работе с указателями. Как мы обсуждали в нашем предыдущем уроке, если у вас есть указатель, указывающий на массив (скажем, на его начало), очень легко получить доступ к элементам этого массива. Вот пример:

#include <stdio.h>

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<sizeof(arr); i++)
{
printf("\n Character pointer pointing to %u, with value %c", ptr, *ptr);
ptr++;
}

for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
{
printf("\n Integer pointer pointing to %u, with value %d", p, *p);
p++;
}

return 0;
}

Итак, в этом коде у нас есть два массива — arr и a. В то время как первый представляет собой массив символов, второй представляет собой целочисленный массив. Затем у нас есть указатели, указывающие на эти массивы — ptr и p соответственно. Затем есть пара циклов for, в которых мы печатаем текущий адрес, на который указывает указатель, и значение, содержащееся в этом адресе.

Вот вывод этого кода на моей машине:

 Character pointer pointing to 726409312, with value a 
Character pointer pointing to 726409313, with value b
Character pointer pointing to 726409314, with value c
Character pointer pointing to 726409315, with value d
Integer pointer pointing to 726409296, with value 1
Integer pointer pointing to 726409300, with value 2
Integer pointer pointing to 726409304, with value 3
Integer pointer pointing to 726409308, with value 4

Теперь, что заслуживает внимания, так это адреса, напечатанные в выводе. Для символьного массива добавление 1 к указателю увеличивает его до самого следующего адреса, но для целочисленного массива добавление 1 к указателю приводит к переходу на 4 адреса вперед. Почему это так?

Ну, все зависит от типа указателя. Указатель символа всегда переходит на количество байтов, которое занимает символ, что обычно равно 1. Точно так же указатель на целое число обычно переходит на 4 байта при увеличении на 1. Таким образом, это должно объяснить разницу между скачками символьного и целочисленного указателя в приведенном выше выводе. .

Продолжая арифметику указателей, указатели можно использовать в выражениях сравнения в некоторых случаях. Например, если вы хотите подтвердить, указывает ли указатель ptr на элемент массива arr (размер размера), вы можете выполнить сравнение следующим образом:

if((ptr >= arr) && (ptr < (arr + size))) 

Таким образом, приведенное выше выражение проверяет, принадлежит ли адрес, содержащийся в указателе, одному из его элементов.

Кроме того, если есть несколько указателей, указывающих на элементы одного и того же массива, вы можете использовать следующие операторы сравнения  ==, !=, < и >=. Фактически, в этих случаях вы также можете выполнять вычитание указателя. Вот пример:

#include <stdio.h>

int main()
{
char arr[]= "Welcome to HowtoForge";

char *ptr = arr;
char *p = arr;

while(*p != '\0')
{
p++;
}

printf("\n Length of the string is %d", (p - ptr));

return 0;
}

Итак, в этой программе мы убедились, что один указатель указывает на первый элемент массива, а второй указатель непрерывно увеличивается, пока не укажет на последний элемент (который равен \0 в константных строках).

Затем, учитывая тот факт, что здесь мы имели дело с символами (каждый из которых занимает один байт), вычитая адрес, указанный первым указателем, из адреса, указанного вторым указателем, мы могли бы найти количество символов, которое, если вы видите, является точным длина строки.

ПРИМЕЧАНИЕ. Имейте в виду, что такие операции, как сложение, умножение, деление и другие, недопустимы, когда речь идет об указателях. Кроме того, виды допустимых операций, которые мы перечислили до сих пор, также допустимы только в том случае, если указатели имеют один и тот же тип и указывают на элементы одного и того же массива.

Заключение

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