Разыменование просто означает чтение значения памяти по заданному адресу. Поэтому, когда у вас есть указатель на что-либо, разыменовать указатель на означает , чтобы прочитать или записать данные, на которые указывает указатель.
В C унарный оператор *
является оператором разыменования. Если x
является указателем, то *x
- это то, на что указывает x
. Унарный оператор &
является оператором address-of . Если x
является чем-либо, то &x
является адресом, по которому x
хранится в памяти. Операторы *
и &
являются обратными друг другу: если x
- это какие-либо данные, а y
- любой указатель, то эти уравнения всегда выполняются:
*(&x) == x
&(*y) == y
Пустой указатель - это указатель, который не указывает на какие-либо допустимые данные (но это не единственный такой указатель). Стандарт C говорит, что неопределенное поведение для разыменования нулевого указателя. Это означает, что может произойти абсолютно все: программа может аварийно завершить работу, она может продолжать работать тихо или стереть ваш жесткий диск (хотя это маловероятно).
В большинстве реализаций вы получите «ошибку сегментации» или «нарушение доступа», если попытаетесь это сделать, что почти всегда приведет к завершению вашей программы операционной системой. Вот один из способов разыменования нулевого указателя:
int *x = NULL; // x is a null pointer
int y = *x; // CRASH: dereference x, trying to read it
*x = 0; // CRASH: dereference x, trying to write it
И да, разыменование нулевого указателя в значительной степени похоже на NullReferenceException
в C # (или NullPointerException
в Java), за исключением того, что стандарт langauge здесь немного более полезен. В C # разыменование пустой ссылки имеет четко определенное поведение: оно всегда выдает NullReferenceException
. Невозможно, чтобы ваша программа могла продолжать работать в режиме без вывода сообщений или стереть ваш жесткий диск, как в C (если только нет ошибки во время выполнения языка, но опять же это невероятно маловероятно).