Разница между этими выражениями: int * a = 0; int * a = 10; - PullRequest
3 голосов
/ 13 января 2011

В чем разница между

int* a = 0;

и

int* a = 10;

Ответы [ 5 ]

10 голосов
/ 13 января 2011

int* a объявляет переменную a как указатель на целое число.

=0 и =10 присваивают некоторое значение переменной.

Обратите внимание, что a являетсяуказатель, его значением должен быть адрес.

  • Адрес 0 имеет особое значение: он NULL, представляет пустой указатель.

  • Адрес 10 не имеет значения: это случайный адрес памяти.Поскольку это не NULL, большинство функций будет считать его действительным адресом, разыменовывает его, и, таким образом, это создаст проблемы (неопределенное поведение) для вашего приложения.

6 голосов
/ 13 января 2011

Один из них должен вызвать предупреждение. Поднимите предупреждения вашего компилятора!

int *a = 0;

С этим все в порядке. Он объявляет указатель a на int и инициализирует его как 0, или указатель NULL, что означает, что он ничего не указывает. Попытка разыменования приведет к плохим вещам, но вы можете проверить, является ли указатель действительным, прежде чем разыменовать его, поэтому NULL указатели на самом деле хорошие вещи.

int *a = 10;

Это не хорошо. Он объявляет тот же указатель на int, но инициализирует его равным 10. Во-первых, компилятор будет жаловаться, что int 10 не может быть неявно приведен к типу указателя. Если вы игнорируете это, указатель указывает на область памяти 10, в которой у вас есть без гарантии является действительным int или допустимым чем-либо или даже принадлежит вашему процессу. Разыменование a будет плохим, точно так же как разыменование a, когда оно было NULL, но, что еще хуже, у нас нет способа проверить правильность a, потому что 10 может быть хорошим или плохим - у нас нет возможности узнать, пока мы не воспользуемся им и не получим то, что хотим / мусор / носовые демоны.

4 голосов
/ 13 января 2011

Во-первых, это не выражения, а объявления.

int* a = 0;

Это объявляет целочисленный указатель и инициализирует его нулевой целочисленной константой во время компиляции, которая преобразуется в нульзначение указателяДругими словами, он объявляет нулевой указатель на целое число.

int* a = 10;

Это объявляет указатель на целое число, которое указывает на то, что ваш конкретный компилятор определяет по адресу, представленному целым числом 10. ВВ подавляющем большинстве случаев там ничего нет, поэтому вы в конечном итоге получаете неопределенное поведение, просто объявив этот указатель.

4 голосов
/ 13 января 2011
int* a = 0;

Назначить 0 для указателя.

int* a = 10;

Назначить 10 для указателя.Обратите внимание, что указатель (т. Е. Переменная, которая должна содержать адрес), а не указатель!

Последний опасен, поскольку он побеждает указатель NULLчеки.

1 голос
/ 13 января 2011

Здесь мы присваиваем значение указателю, int * a = 0;означает int a * = NULL;Однако в c ++ int * a = 10 не будет компилироваться, поскольку для «преобразования из целочисленного типа в тип указателя требуется reinterpret_cast, приведение в стиле C или преобразование в стиль функции», поскольку компилятор считает, что 10 является целочисленным типом, а не указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...