Шаг 17.
Указатели и адреса

    Здесь мы вспомним такие понятия, как "указатели" и "адреса".

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

    Указатель существенно связан с типом объекта, на который он ссылается. Если в описании перед обозначением объекта поставить символ "*", то оно будет описывать указатель на объект того же типа и класса памяти, которые соответствуют данному обозначению без звездочки.

    Указатели и целые не являются взаимозаменяемыми объектами. Константа - единственное исключение из этого правила: ее можно присвоить указателю и указатель можно сравнить с нулевой константой. Чтобы показать, что это специальное значение для указателя, вместо числа 0, как правило, записывают NULL - константу, определенную, в том числе, в файле stdio.h.

    Унарная операция "*", называемая  операцией косвенной адресации, рассматривает свой операнд как адрес объекта и обращается по этому адресу, возвращая его содержимое.

    Унарная операция "&", называемая операцией нахождения адреса, будучи примененной к переменной, возвращает ее адрес.

    Например, рассмотрим последовательность операторов:

   int x,y,*px; // Описание целочисленных переменных x,y и
                // указателя на целое значение px.          
   px = &x;     // Значением переменной px станет адрес переменной x.
   y  = *px;    // Переменная y приобретает значение "того",
                // на что указывает px, т.е. значение переменной x.

    Таким образом, два оператора присваивания в примере эквивалентны одному оператору y=x;, и *px может появляться в любом выражении, в котором может встретиться х, например, продолжим рассмотрение предыдущего примера:

   *px = 0;     // Переменная х получает значение 0.
   y = *px + 1; // Переменная y получает значение на 1 большее 
                // значения х.
   *px += 1;    // Увеличение содержимого x на единицу.
   *px++;       // Увеличение содержимого x на единицу, при
                // этом постфиксная операция ++ не изменяет px,
                // пока объект по адресу px не будет получен.  
   *++px;       // Префиксная операция ++(--) увеличивает
   *--px;       // (уменьшает) px до получения значения x.
   py = px;     // Копирование содержимого указателя px в ука- 
                // затель py в результате чего py указывает на 
                // то же, что и px. 


    Внимание!
  1. Операция "&" применима только к переменным: конструкции вида &(х-3) или &5 запрещены.
  2. Нельзя получить адрес регистровой переменной.



    На следующем шаге мы рассмотрим операции, которые можно выполнять над указателями.


Предыдущий шаг Содержание Следующий шаг