2016-12-15 4 views
0

Это исходный кодПринимая адрес указателя?

#include<stdio.h> 
void main() 
{ 
int *p,a=5; 
p=&a; 
scanf("%d",p); 
printf("%d\t",*p); 
printf("%d",a); 
} 

Как мы можем принять адрес указателя? .Cuz имеет адрес переменной «а» already.There не содержит ошибок, представленные компилятором. Кроме того, я не могу понять вывод.

выход: (если мой вход 45)

45 45 
+0

С 'scanf ("% d ", p);' вы передаете адрес, указанный указателем 'p', который является адресом' a'. – LPs

+3

Что вы пытаетесь достичь? Что вы подразумеваете под _accepting_? – moooeeeep

+2

Поскольку 'p = & a;', 'scanf ("% d ", p);' такое же, как 'scanf ("% d ", &a);'. –

ответ

1

Ваш указатель также является переменной, как a и имеет собственный адрес. Вы можете получить к нему доступ, указав &p. Но вы говорите scanf("%d", p);, так что он обращается к указательному адресу указателя.

EDIT: если вы хотите, чтобы напечатать адрес указателя вы можете использовать printf("%p\n",(void *) &p);

+0

но как я могу принять указательный адрес указателя? У него нет фиксированного значения? – user2050807

+0

, когда вы определяете указатель, который вы выделяете для этого указателя, и вы не можете изменить его адрес. – cokceken

+1

Вам нужно наложить на ' (void *) 'перед печатью значения указателя:' printf ("% p \ n", (void *) & p) '. Невыполнение этого правила - неопределенное поведение. –

0

Вы можете получить доступ непосредственно указатель на его адрес & р

int pa; 
int *p; 
scanf("%d", &pa); 

p = (int*) pa; 

printf("%p\t", p); // printing pointer stored address (got from input) 
printf("%d\n", (void *) *p); // printing value stored in address stored in p, of course would be segfault in case of invalid address 

также использовать его с осторожностью, его непереносимым и может в результате не определено поведение. он может работать на 32-битных машинах из-за того, что int и int * имеют одинаковую длину бит, но для других CPU могут не работать.

+4

Что за идея делать 'scanf ("% d ", &p);'? На самом деле это провоцирует неопределенное поведение, потому что 'd' определено для сканирования' int 'только. – alk

+0

Я согласен, что его не переносимый, но на самом деле на 32-битных машинных int и int * имеют одинаковую длину, поэтому мы можем копировать содержимое int в int *. int может хранить адрес чего-то, но не может его разыменовать. –

+2

Вставить в '(void *)' перед печатью адрес. Это требуется стандартом. –

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