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