Code #define PR(x) printf("x=%u, *x=%d, &x=%u\n", x, *x, &x); #include <stdio.h> #include <conio.h>
void main(void) { int mas[]={100,200,300}; int *ptr1, *ptr2; ptr1=mas; ptr2=&mas[2]; PR(ptr1); ptr1++; PR(ptr1); PR(ptr2); ++ptr2; printf ("ptr2-ptr1=%u\n", ptr2-ptr1); getch(); } Результат: Начнём с того, что программа написана на Си, а не на Си++. Как не парадоксально, но это разные вещи. #define PR(x) printf("x=%u, *x=%d, &x=%u\n", x, *x, &x); #define - директива препроцессора, работа производится до компиляции. Данная строка создаёт псевдоним для операции форматированного вывода на экран переменной x. Имеется массив типа int с тремя элементами, а также два указателя на int (ptr1 и ptr2). ptr1=mas; Данная запись означает то, что нашему первому указателю присваивается адрес с которого начинается наш массив. ptr2=&mas[2]; Второму указателю присваивается адрес 3-го элемента. (не забываем что нумерация в Си начинается с нуля) PR(ptr1); - выводим на экран. x-ом у нас является указатель, значит, вывод x показывает нам адрес, хранящийся в указателе. Вывод *x, операция разименовывания, показывает значение, находящиеся по адресу хранящемуся в указателе, а это адрес начала массива, т.е. первый элемент (индекс ноль у него, ещё раз повторю) Вывод &x, операция взятия адреса, выводим адрес указателя, адрес, по которому хранится наш указатель. (мозг можно свернуть по началу, правда ? :)) Ну да ничего страшного, указателями пугают все кому не лень (особенно ленивые) Очень мощный инструмент в этом языке. Знать, как работать с указателями обязательно необходимо. Далее... Code ptr1++; PR(ptr1); PR(ptr2); Увеличиваем значение в ptr1, т.е. адрес и выводим на экран. Так как ptr1 - указатель, его значение увеличится на длину типа представляемой информации, т.е. у нас, значения типа int, а это 4-е байта, значит увеличение адреса произойдёт на 4. Это видно из скриншота результата. Адрес увеличился на 4, значение лежащее по этому адресу = 200 (второй элемент массива), адрес указателя не изменился. Затем, выводим значение второго указателя, а это: Указатель хранит адрес значения последнего элемента массива, естественно адрес больше на четыре байта чем ptr1, который указывает на второй элемент. Значение по адресу = 300, адрес, где хранится второй указатель отличается от первого. (что вполне логично) Code ++ptr2; printf ("ptr2-ptr1=%u\n", ptr2-ptr1); getch(); Увеличиваем адрес, вычитанием указателей определяем количество элементов. Например чтобы узнать количество элементов в массиве, нам нужно в pr1 поместить адрес начала массива (это просто mas), а в ptr2 поместить адрес, следующий за массивом (ptr2=mas[2]; ptr2++;), а затем вычесть из второго первый (ptr2-ptr1=количество элементов массива) getch(); - ждёт нажатия клавиши на клавиатуре (так как программа на Си, я не стал использовать функцию system) Счастливо !
|