Разыменование просто означает чтение значения памяти по заданному адресу. Поэтому, когда у вас есть указатель на что-то, в разыменовать указатель означает читать или записывать данные, на которые указывает указатель.
В C унарный оператор *
оператор разыменования. Если x
является указателем, то *x
указывает на то, что x
указывает на. Унарный оператор &
является адресом - . Если x
- это что-то, то &x
- это адрес, в котором x
хранится в памяти. Операторы *
и &
являются инверсиями друг друга: если x
- это любые данные, а y
- любой указатель, то эти уравнения всегда верны:
*(&x) == x
&(*y) == y
A null Указатель - это указатель, который не указывает на какие-либо действительные данные (но это не единственный такой указатель). В стандарте 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 (если в языке не существует ошибки, но опять же это невероятно маловероятно).