Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

6.6. Использование спецификатораconstс указателями

Спецификация constдает возможность программисту информировать компилятор о том, что значение данной переменной не должно изменяться [1].

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

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

  1. неконстантный указатель на неконстантные данные;

  2. неконстантный указатель на константные данные;

  3. константный указатель на неконстантные данные;

  4. константный указатель на константные данные.

Каждая комбинация обеспечивает доступ с разным уровнем привилегий.

Наивысший уровень доступа предоставляется неконстантным указателям на неконстантные данные – данные можно модифицировать посредством разыменования указателя, а сам указатель может быть модифицирован, чтобы он указывал на другие данные. Объявление неконстантного указателя на неконстантные данные не содержит const.

Неконстантный указатель на константные данные – это указатель, который можно модифицировать, чтобы указывать на любые элементы данных подходящего типа, но данные, на которые он ссылается, не могут быть модифицированы. Такой указатель можно было бы использовать, чтобы передать в качестве аргументов массивы функции, которая будет обрабатывать каждый элемент массива без модификации данных (рис. 6.18).

#include <iostream>

using namespace std;

void CubeByReference (const int*);

int main(){

int number2 = 5;

cout << "number2 before " << number2 << endl;

CubeByReference (&number2);

cout << "number2 after " << number2 << endl;

return 0;

}

void CubeByReference (const int* nPtr){

int number = 20;

nPtr = &number;

cout << *nPtr**nPtr**nPtr << endl;

//*nPtr= *nPtr**nPtr**nPtr; нельзя изменять данные с помощью //операции разыменования указателя

number = 1;

cout << *nPtr**nPtr**nPtr << endl;}

Рис. 6.18. Использование неконстантного указателя на константные данные

Константный указатель на неконстантные данные – это указатель, который всегда указывает на одну и ту же ячейку памяти, данные в которой можно модифицировать посредством указателя. Cсылки реализуются через константный указатель. Этот вариант реализуется по умолчанию для имени массива.Имя массива – это константный указатель на начало массива. Используя имя массива и индексы массива можно обращаться ко всем данным в массиве и изменять их. Указатели, объявленные какconst, должны получить начальные значения при своем объявлении (если указатель является параметром функции, он получает начальное значение, равное указателю, который передается в функцию)(рис. 6.19.)

void CubeByReference (int* const);

int main()

{

int number2;

number2 = 5;

cout << "number2 before " << number2 << endl; // 5

CubeByReference (&number2);

cout << "number2 after " << number2 << endl; // 125

number2 = 10;

cout << "number2 before " << number2 << endl; // 10

CubeByReference (&number2); // 1000 потом 1000000000

cout << "number2 after " << number2 << endl; // 1000

return 0;

}

void CubeByReference (int* const nPtr)

{

int number = 20;

//nPtr = &number; нельзя изменять значение указателя

cout << *nPtr**nPtr**nPtr << endl; //125

*nPtr= *nPtr**nPtr**nPtr;

number = 1;

cout << *nPtr**nPtr**nPtr << endl; //1953125

}

Рис. 6.19. Использование константного указателя на неконстантные данные

Наименьший уровень привилегий доступа предоставляет константный указатель на константные данные. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать. Это выглядит так, как если бы массив нужно было передать функции, которая только просматривает массив, использует его индексы, но не модифицирует сам массив (см. рис. 6.20.).

int number1, number2;

number1 = 10;

number2 = 5;

const int * const ptr = &number2;

cout << *ptr << endl;;

//*ptr = number1; нельзя изменять данные через операцию разыменования

//ptr = &number1; нельзя изменять значение самого указателя

number1 = 10;

cout << *ptr << endl

Рис. 6.20. Использование неконстантного указателя на неконстантные данные