Указатель (pointer) — это адрес объекта или функции. Указатели хранятся в переменных указательных типов. Корректный указатель на объект содержит адрес этого объекта. int x = 7;
int* pi = &x; // указатель pi ссылается на объект x int xx = *pi; // *pi — это значение объекта,
// на который ссылается указатель pi, т.е. 7
Некорректный указатель — это указатель, не содержащий указателя ни на один объект.
int* pi2; // неинициализированный
*pi2 = 7; // неопределенное поведение
pi2 = 0; // нулевой указатель (указатель pi2 остается некорректным)
*pi2 = 7; // неопределенное поведение
pi2 = new int(7); // теперь указатель pi2 становится корректным
int xxx = *pi2; // отлично: переменная xxx становится равной 7
Также вам может показаться, что такая тема как
http://zap6.ru/
никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт zap6.ru
Тема интернет-магазин автозапчастей зэп там представлена весьма широко.
Мы хотим, чтобы все некорректные указатели были нулевыми (0), поэтому можем провести проверку.
if (p2 == 0) { // "если указатель некорректный"
// не используйте значение *p2
}
Или еще проще:
if (p2) { // "если указатель корректный"
// используйте значение *p2
}
Перечислим операции над указателями на объекты (не-void). Операции сравнения <, <=, >, >+ можно применять только к указателям одного и того же типа внутри одного и того же объекта или массива.
Подчеркнем, что операции арифметики указателей (например, ++p и p+=7) могут применяться только к указателям, ссылающимся на элементы массива, а эффект разыменования указателя, ссылающегося на область памяти за пределами массива, не определен (и, скорее всего, не сможет быть проверен компилятором или системой выполнения программ).
Только операции над указателем типа void* являются копированием (присваиванием или инициализацией) и приведением (преобразованием типа).
Указатель на функцию можно только копировать и вызывать. Рассмотрим пример.
typedef void (*Handle_type)(int); void my_handler(int);
Handle_type handle = my_handler; handle(10); // эквивалент my_handler(10)
Опубликовал katy
May 01 2015 12:20:55 ·
0 Комментариев ·
3100 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.