code snippet-1 strong> code SNIPPET-2 strong> p> Snippet-1 donne la sortie x = 3 & p = 3, mais snippet-2 donne x = 3 & p = une valeur aléatoire em> p> p> < / p>
4 Réponses :
Cet extrait de code a un comportement indéfini car le pointeur par la déséroférance du pointeur ( Il semble que cette déclaration p> vous voulez dire p> c'est le pointeur obtient l'adresse de la variable < Code> X Code>. P> Faites attention à ce que le message sorti de cet appel d'un tel appel de PrintF P> est déroutant. Il serait préférable d'écrire p> ce n'est pas la valeur du pointeur lui-même émise mais la valeur de l'objet pointué émettant. P> Vous devez distinguer le sens de l'astérisque dans une déclaration et dans une expression. p> dans une déclaration comme celle-ci p> L'astérisque signifie que Ici est déclaré un pointeur et obtient l'adresse de la variable x. p> dans une déclaration d'expression comme celle-ci p> L'astérisque indique l'opérateur de la désérogression qui est utilisé pour accéder à l'objet pointu au moyen de la valeur stockée dans le pointeur utilisé comme adresse. p> p> p code> n'a pas été initialisé et a une valeur indéterminée qui ne pointe pas sur un objet valide. Donc, cette déclaration p> * p code>) tente d'accéder à la mémoire à une adresse invalide. P>
Le «P» utilisé dans l'impression a été utilisé comme une variable aléatoire afin de le distinguer de «X», cela n'indique pas vraiment à un pointeur, bien que j'ai eu votre point.
qui est int * p = & x; code> est équivalent à p = & x code> prend l'adresse de la variable x et des places il dans p code> (qui est un pointeur). p> *p = &x; // Not the same
Cette ligne: est une déclaration em> de en contraste, cette ligne: p > p code> avec l'initialisation. Il initialise p code>, qui est un int * code>, sur & x code>. P> *p=&x;
int x;
int *p;
x = 3;
p = &x; // No * operator here.
printf("x = %d\n", x);
printf("*p = %d\n", *p);
Dans le deuxième extrait,
* p = & x; code> Si cela ne crie pas un avertissement, vous devez élever vos avertissements à des niveaux renforcés et les traiter comme des erreurs parce que c'est exactement ce qu'ils sont. Affectationint * code> àint code> est toutes sortes de mal.@LUNDIN Je ne sais pas ce que vous entendez par "Valide C", mais Snippet-1 compile proprement sur un compilateur GCC, en donnant la sortie attendue.
@AYUSHNANGLIA Compile parfaitement signifie aucun avertissement. Valide C signifie qu'il suit la norme C réelle. Le GCC avec paramètres par défaut ne donne pas d'erreurs pour les violations du langage C, uniquement des avertissements. Lisez ceci: Stackoverflow.com/questions/52186834/...
Parler clairement, Lundin et Craig ont raison.
* p = & x; code> est définitivement faux et non valide c dès quep code> n'est pas un pointeur sur le pointeur (ce qui n'est pas le cas dans votre exemple). Raison Pourquoi est expliqué en détail dans les réponses à votre question. BTW, ils parlent d'un snippet 2, pas d'extraits 1.J'admets, * p = & x; Est faux et le compilateur donne un avertissement pour cela, mais il exécute int * p = & x; b> sans aucun avertissement (s). C'est tout ce que je voulais clarifier