2012-05-04 2 views
1
{ 
    int *p=12; 
    printf("%p",p); 
    printf("\n%d",p); 
} 

ВЫВОД:инициализация указателя с произвольным числом

0000000C

Вопрос: Так как р присваивается адрес 0x0000000c?

{ 
    int *p=12; 
    *p=22; 
}  

Но этот не запускается. Так что же происходит на самом деле?

+0

Я думаю, что это просто представление, которое отбрасывает вас ... Это шестнадцатеричный ... он идет 0x0 - 0x9, 0xA = 10, 0xB = 11, 0xC = 12 Итак, каков ваш вопрос после понимания этого? – Jay

ответ

4
int *p=12; 

Это объявляет указатель и устанавливает адрес, на который он указывает 12.

*p=22; 

Это де-ссылается на указатель и записывает 22 в int по этому адресу памяти 12. Поскольку вы не выделили какую-либо память и просто указали указатель на случайный адрес, это приведет к ошибке выполнения.

Что вас смущает, так это то, что обе части кода содержат *p=.... Однако первое назначение - указателю, а второе присваивание - указателю. Это всего лишь одна из тех нотационных перегрузок, к которым вы должны привыкнуть при программировании на C.

+0

, так что в первом случае не следует печатать f («% d», * p) возвращать мусор? но программа вылетает из строя. –

+0

Как говорится в ответе, чтение памяти, к которой у вас нет доступа, приведет к ошибке выполнения. Если вы * можете * прочитать его, то да, вы, вероятно, увидите мусор. –

+0

Хорошо, окончательный запрос. Правильно ли это утверждение: указатель может указывать на этот случайный адрес, потому что определение указателя является допустимым, и, следовательно, ему выделена память для хранения этого адреса, но никакое значение не может быть сохранено по этому адресу, потому что память по этому адресу не выделяется компилятор (подобно использованию неопределенных переменных). –

0

Оба случая имеют неопределенное поведение.

  • Поведение первого примера не определено, поскольку используется недопустимый указатель.

  • Второй пример хуже, так как вы derefernce указатель с недействительным адресом.

    int *p=12; // set the address 12 to the int pointer called p 
    *p=22;  // set the value 22 to the address 12 (invalid address) 
    
+0

Он указывает на 12, пока он правильно использует это, тогда нет ничего плохого в этом .... (IMHO) – Jay

+0

он не указывает на 12, у него есть указатель со значением 12 (указывая на адрес 12) – MByD

+0

Я прошу не согласиться ... & p не будет 12 .... Адрес не 12 .... Он указывает на значение 12 с отменой ссылки на адрес (указатель) .... – Jay

Смежные вопросы