Я начинаю изучать C ++. Я столкнулся с небольшой путаницей в отношении указателей, в частности указателя NULL. Насколько я понимаю, когда вы объявляете указатель и устанавливаете его для указания значения, вы можете сделать следующее:
int var = 10;
int *ptr;
ptr = &var;
*ptr = 20;
Это изменит значение var на 20. Но когда вы устанавливаете нулевой указатель, вы делаете следующее:
int *ptr = NULL;
Не означает ли это, что вы присваиваете значение NULL любой переменной, на которую указывает ptr, а не на адрес из-за оператора *? Я думал, что NULL-указатель имеет значение (его адрес) как 0, поэтому он не указывает ни на что, из того, что я прочитал. Будет ли больше смысла делать это:
int *ptr;
ptr = NULL // or 0?
Хотелось бы получить объяснение в терминах непрофессионала, я все еще изучаю все термины по мере того, как я пишу код и исследую, поэтому мне бы хотелось получить объяснение любых используемых вами терминов программирования.
Говоря int *ptr = NULL;
вы говорите: «Я объявляю int-указатель с именем ptr
что я хочу указать на местоположение 0
(NULL
). Это все, что говорит.
Теперь, если вы пытаетесь читать или писать в ptr
ты получишь неопределенное поведение, это вообще ужасное место (гораздо хуже, чем просто получить ошибку, потому что ваша программа может начать получать проблемы в другом месте, и вы не будете знать, почему). Но, как правило, NULL
указатели используются, когда вы хотите показать, что он не должен использоваться и должен быть инициализирован.
Как сказал Дэвид Шварц,
Это будет легче понять, если вы используете
int* ptr
вместоint *ptr
,
Это потому, что тип ptr
действительно int*
, указатель на целое число. При объявлении типов, *
означает указатель. Это только при использовании ваших указателей в выражениях, таких как *ptr = 20
что *
означает «разыменование».
Вы можете заменить странные T*
синтаксис с обычным синтаксисом шаблона, благодаря шаблонам псевдонимов C ++ 11:
template<typename T> using pointer = T*;
pointer<int> ptr = nullptr;
В
int *ptr = NULL;
*
является не *
оператор. *
символ — это просто часть синтаксиса объявления указателя. Это не имеет ничего общего с *
оператор вообще.
Операторы используются в выражениях. Выше *ptr
является декларатором в декларации. Декларатор не является выражением. В этом объявителе нет операторов, даже если некоторые символы выглядят как «операторы».
NO. Везде, где вы видите *
оператор с ptr
это будет означать разыменование, КРОМЕ этого первого раза. Когда вы делаете
int *ptr = 0;
*
делает ptr
целочисленный указатель и указывающий на него нулевой адрес, «нулевое» место в памяти
В современном C ++ лучше использовать
int *ptr = nullptr;
Это означает, что ваш ptr
нет места для почтения в памяти.
nullptr
тип nullptr_t
, это не целое число или любой другой тип. Вместо этого он более безопасен в зависимости от макроса NULL. поскольку NULL
может быть преобразовано в целое число, если оно определено как 0
и может создавать проблемы при обработке параметров функции и других сценариев.
Проще говоря:
int *ptr = NULL;
означает, что есть указатель с именем ptr, который был назначен равным NULL, что означает, что сейчас он никуда не указывает (ни на какое значение мусора или что-либо еще), он имеет значение NULL!