Запутывание объявления нулевых указателей в переполнении стека

Я начинаю изучать 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?

Хотелось бы получить объяснение в терминах непрофессионала, я все еще изучаю все термины по мере того, как я пишу код и исследую, поэтому мне бы хотелось получить объяснение любых используемых вами терминов программирования.

0

Решение

Говоря int *ptr = NULL; вы говорите: «Я объявляю int-указатель с именем ptr что я хочу указать на местоположение 0 (NULL). Это все, что говорит.

Теперь, если вы пытаетесь читать или писать в ptr ты получишь неопределенное поведение, это вообще ужасное место (гораздо хуже, чем просто получить ошибку, потому что ваша программа может начать получать проблемы в другом месте, и вы не будете знать, почему). Но, как правило, NULL указатели используются, когда вы хотите показать, что он не должен использоваться и должен быть инициализирован.

Как сказал Дэвид Шварц,

Это будет легче понять, если вы используете int* ptr вместо int *ptr,

Это потому, что тип ptr действительно int*, указатель на целое число. При объявлении типов, * означает указатель. Это только при использовании ваших указателей в выражениях, таких как *ptr = 20 что * означает «разыменование».

7

Другие решения

Вы можете заменить странные T* синтаксис с обычным синтаксисом шаблона, благодаря шаблонам псевдонимов C ++ 11:

template<typename T> using pointer = T*;

pointer<int> ptr = nullptr;
2

В

int *ptr = NULL;

* является не * оператор. * символ — это просто часть синтаксиса объявления указателя. Это не имеет ничего общего с * оператор вообще.

Операторы используются в выражениях. Выше *ptr является декларатором в декларации. Декларатор не является выражением. В этом объявителе нет операторов, даже если некоторые символы выглядят как «операторы».

1

NO. Везде, где вы видите * оператор с ptr это будет означать разыменование, КРОМЕ этого первого раза. Когда вы делаете

int *ptr = 0;

* делает ptr целочисленный указатель и указывающий на него нулевой адрес, «нулевое» место в памяти

0

В современном C ++ лучше использовать

int *ptr = nullptr;

Это означает, что ваш ptr нет места для почтения в памяти.

nullptr тип nullptr_t , это не целое число или любой другой тип. Вместо этого он более безопасен в зависимости от макроса NULL. поскольку NULL может быть преобразовано в целое число, если оно определено как 0 и может создавать проблемы при обработке параметров функции и других сценариев.

0

Проще говоря:

int *ptr = NULL;

означает, что есть указатель с именем ptr, который был назначен равным NULL, что означает, что сейчас он никуда не указывает (ни на какое значение мусора или что-либо еще), он имеет значение NULL!

0
По вопросам рекламы [email protected]