Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка№7.docx
Скачиваний:
1
Добавлен:
25.11.2018
Размер:
35.37 Кб
Скачать

24. Будет-ли ошибкой присваивание адреса объявленной константы

обычному указателю?

Да

25. Будет-ли ошибкой присваивание адреса объявленной константы

указателю-на-const?

нет

26. Как задать указатель, чтобы его самого сделать константой, и

таким образом не позволять изменять переменную, на которую

указывает.

При работе с указателями вы можете воспользоваться ключевым

словом const двумя различными способами. В условиях первого способа

указатель ссылается на постоянный объект, и это обстоятельство не

дает возможности использовать указатель для изменения величины, на

которую он указывает. Второй способ состоит в том, чтобы сам

указатель сделать константой, и таким образом не позволять изменять

переменную, на которую указывает указатель.

Мы присвоили адрес обычной переменной указателю-

на-const. При этом остается еще два варианта: присваивание адреса

переменной типа const указателю-на-const и присваивание адреса const

обычному указателю. Можно ли использовать эти варианты? Первый —

да, а второй — нет:

const float g_earth = 9.80;

const float * ре = &g_earth; // ПРАВИЛЬНО

const float g_moon = 1.63;

float * pm = &g_moon; // НЕПРАВИЛЬНО

27. Прокомментируйте код:

double trouble = 2.0E30;

const double * const stick = &trouble;

При желании вы можете объявить указатель со статусом const на

объект со статусом const:

double trouble = 2.0E30;

const double * const stick = &trouble;

Здесь stick может указывать только на trouble, при этом stick не

может быть использован для того, чтобы изменить значение trouble.

Короче говоря, как stick, так и *stick имеют статус const.

28. Какими тремя способами можно задать строку?

Для представления строки в вашем

распоряжении имеется три варианта:

• Массив типа char

• Строковая константа, заключенная в кавычки (она еще

называется строковым литералом).

• Указатель на значение типа char (сокращенно — указатель-на-

char) ссылается на начало строки

29. Назовите различие между строкой и обычным массивом.

Необходимо-ли дополнительно передавать длину строки в списке

аргументов функции, как это делают в случае с массивами?

Существенное различие между строкой и обычным массивом

заключается в том, что в строке имеется встроенный завершающий

символ. Это означает, что не следует передавать длину строки как

аргумент. Вместо этого функция может воспользоваться циклом, чтобы

поочередно проанализировать каждый символ строки, пока цикл не

достигнет завершающего пустого символа.

30. Что означает выражение *"pizza"? Что можно сказать о "taco"[2]?

31. Передача структур в качестве аргумента по значению.

Структуры ведут себя по отношении к функциям как базовые

переменные, принимающие только одно значение. Вы можете передать

структуру по значению точно так же, как это делается с обычной переменной. В этом случае функция работает с копией исходной

структуры. Функция может возвращать структуры.

32. Передача адресов структур. Оператор непрямой принадлежности.

Предположим, что вы хотите сэкономить время и память,

передавая адрес структуры, вместо того чтобы передавать саму

структуру. Это требует переделок функций таким образом, чтобы они

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

какие внести изменения в функцию show_polar(). Требуется внести

следующие три изменения:

• При вызове функции передавать адрес структуры (&pplace), но

не саму структуру (pplace).

• Объявить формальный параметр таким образом, чтобы он был

указателем-на-polar, т.е. имел тип polar*. Поскольку функция не

должна подвергать структуру изменениям, нужно пользоваться

спецификатором const.

• Поскольку формальный параметр представляет собой

указатель, а не структуру, воспользуйтесь оператором

непрямой принадлежности (->) вместо операции

принадлежности (точка).

// отобразить полярные координаты,

// представить с этой целью угол в градусах

void show_polar (const polar * pda)

{

const double Rad_to_deg = 57.29577951;

cout << "distance = " << pda->distance;

cout << ", angle — "<< pda->angle * Rad_to_deg;

cout << " degrees\n" ;

}