Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
17.04.2015
Размер:
78.15 Кб
Скачать

7. Указатель на переменную и константу.

Указатель может быть константой или переменной, а также указывать на константу или переменную.

Рассмотрим примеры:

int i; // целая переменная

const int ci = 1; // целая константа

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

const int * pci; // указатель на целую константу

int * const ср = &i; // указатель-константа на целую

переменную

const int * const срс = &ci; // указатель-константа на целую

константу

Как видно из примеров, модификатор const, находящийся между именем указателя и звездочкой, относится к самому указателю и запрещает его изменение, а const слева от звездочки задает посто-янство значения, на которое он указывает.

Для инициализации указателей использована операция получения адреса &.

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

8. Инициализация указателей.

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

Существуют следующие способы инициализации указателя:

1. Присваивание указателю адреса существующего объекта:

• с помощью операции получения адреса:

int а = 5; // целая переменная

int* р = &а; //в указатель записывается адрес а

int* р (&а): // то же самое другим способом

• с помощью значения другого инициализированного указателя:

int* r = р;

• с помощью имени массива или функции, которые трактуются как адрес:

int b[10]; // массив

i n t * t = b; // присваивание адреса начала массива

void f ( int а ){ /* ... * / } // определение функции

void ( * pf ) ( int ); // указатель на функцию

pf = f; // присваивание адреса функции

2. Присваивание указателю адреса области памяти в явном виде:

char* vp = (char *)0хВ8000000:

Здесь ОхВ8000000 — шестнадцатеричная константа, (char *) — операция приведения типа: константа преобразуется к типу «указатель на char».

3. Присваивание пустого значения:

int* SUXX = NULL;

1nt* rulez = 0:

В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю. Рекомендуется использовать просто О, так как это значение типа int будет правильно преобразовано стандартными способами в соответствии с контекстом. Поскольку гарантируется,что объектов с нулевым адресом нет, пустой указатель можно использовать для проверки, ссылается указатель на конкретный объект или нет.

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