С++ для начинающих




Указатели - часть 4


Вот как выглядит типичный пример использования адресной арифметики при переборе элементов массива с помощью итератора:

int ia[10];

int *iter = &ia[0];

int *iter_end = &ia[10];

while (iter != iter_end) {

  do_something_with_value (*iter);

  ++iter;

}

Упражнение 3.8

Даны определения переменных:

int ival = 1024, ival2 = 2048;

int *pi1 = &ival, *pi2 = &ival2, **pi3 = 0;

Что происходит при выполнении нижеследующих операций присваивания? Допущены ли в данных примерах ошибки?

(a) ival = *pi3;   (e) pi1 = *pi3;

(b) *pi2 = *pi3;   (f) ival = *pi1;

(c) ival = pi2;    (g) pi1 = ival;

(d) pi2 = *pi1;    (h) pi3 = &pi2;

Упражнение 3.9

Работа с указателями – один из важнейших аспектов С и С++, однако в ней легко допустить ошибку. Например, код

pi = &ival;

pi = pi + 1024;

почти наверняка приведет к тому, что pi будет указывать на случайную область памяти. Что делает этот оператор присваивания и в каком случае он не приведет к ошибке?

Упражнение 3.10

Данная программа содержит ошибку, связанную с неправильным использованием указателей:

int foobar(int *pi) {

  *pi = 1024;

  return *pi;

}

int main() {

  int *pi2 = 0;

  int ival = foobar(pi2);

  return 0;

}

В чем состоит ошибка? Как можно ее исправить?

Упражнение 3.11

Ошибки из предыдущих двух упражнений проявляются и приводят к фатальным последствиям из-за отсутствия в С++ проверки правильности значений указателей во время работы программы. Как вы думаете, почему такая проверка не была реализована? Можете ли вы предложить некоторые общие рекомендации для того, чтобы работа с указателями была более безопасной?




Содержание  Назад  Вперед