ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн

Переменные указатели

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

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

Какого же типа может быть переменная-указатель? Она не того же типа, что и переменная, адрес которой мы храним: указатель на int не имеет типа int. Воз- можно, вы думаете, что указатели принадлежат некоторому типу pointer или ptr. Однако здесь все немного сложнее. В программе PTRVAR показан синтаксис пе- ременных-указателей.

// ptrvar.cpp

// указатели (адреса переменных)

#include <iostream>

using namespace std;

 

int main ( )

{

  int var1 = 11;        // две переменные

  int var2 = 22;

 

  cout << &var1 << endl // покажем адреса переменных

       << &var2 << endl << endl;

 

  int* ptr; // это переменная-указатель на целое

 

  ptr = &var1;          // присвоим ей значение адреса var1

  cout << ptr << endl;  // и покажем на экране

 

  ptr = &var2;          // теперь значение адреса var2

  cout << ptr << endl;  // и покажем на экране

 

  return 0;

}

 

В этой программе определены две целочисленных переменных var1 и var2, которые инициализированы значениями 11 и 22. Затем программа выводит на дисплей их адреса.

Далее в программе определена переменная-указатель в строке

int* ptr;

Для непосвященных это достаточно странный синтаксис. Звездочка означает указатель на. Таким образом, в этой строке определена переменная ptr как ука- затель на int, то есть эта переменная может содержать в себе адрес переменной типа int.

Почему же идея создания типа pointer, который бы включал в себя указатели на данные любого типа, оказалась неудачной? Если бы этот тип существовал, то мы могли бы записать объявление переменной этого типа как:

pointer ptr;

Проблема в том, что компилятору нужны сведения о том, какого именно типа переменная, на которую указывает указатель (мы поймем почему, когда будем рассматривать указатели и массивы). Синтаксис, используемый в C++, позволяет нам объявить указатель следующим образом:

char* cptr;          //            указатель на символьную переменную

int* iptr;                 // указатель на целую переменную

float* fptr;            // указатель на вещественную переменную

Distance* distptr;           // указатель на переменную класса Distance

 

5