int i=40; char *p; p=(char *)&i;//What actually happens here? printf("%d",*p); What will be the output? Please help!
5 Réponses :
ici, vous êtes
Supposons tandis que 40 a été couvert Premier 8 bit de 2 octets, il tiendra un équivalendue de 40, mais comme vous l'imprimez avec int i = 40; code> // allouant la mémoire pour iTeger I et attribution de la valeur 40 à celle-ci p>
char * code> p>
i code> est alloué à
1021 adresse code> de sorte que p aura cette adresse avec la limite de 1 octet afin de pouvoir contenir
à 8 bits de la représentation de 40; code> p>
% d code> idio shopuld impression
40 p> p> p>
Sauf que la machine pourrait être grosse Endian dans ce cas, vous obtiendrez 0.
Pourquoi est-il nécessaire, quelle est la différence entre char * p = (char *) & i code> et
char * p = & i code>?
p=(char *)&i;//What actually happens here? It takes the address of i and casts it to a char pointer. So the value of *p is now the first byte of i. What that value is, is platform dependent.
Très probablement ce serait 0 ou 40 (selon l'endansion de la machine).
Pourquoi est-il nécessaire, quelle est la différence entre char * p = (char *) & i code> et
char * p = & i code>?
Cela dépend. Sous Windows, la sortie durera 40 ans, mais cela est juste à cause de beaucoup de coïncidences: P>
Tout d'abord, Printf ne vérifie pas le type de ses arguments, de sorte que, puisqu'il voit% d dans la chaîne de format, il suppose que l'argument donné est un int. Bien que * p n'est qu'un caractère, le résultat est favorisé à un Int (comme pour chaque argument non spécifié dans le prototype de fonction). P>
Deuxièmement, P pointera sur la mémoire prise par la variable I, mais comme c'est un pointeur de caractère, il ne prendra qu'un octet de la mémoire de i. Étant donné que Windows / Intel utilise la première convention d'octet moins important-octet, 40 sera stockée comme modèle d'octet "40 0 0 0", car * p prend le premier octet (char), le résultat sera de 40. Si j'aurais le Valeur 256 ou plus grande, le résultat serait incorrect. P>
Voir aussi ce Stackoverflow.com/questions/34826036/...
Commençons par la recherche de savoir comment le contenu de i code> et
p code> serait aménagé en mémoire (en supposant l'ordre de Big-Endian):
Item Address 0x03 0x02 0x01 0x00
---- ------- ----------------------
i 0x08000000 0x00 0x00 0x00 0x28
p 0x08000004 0x08 0x00 0x00 0x00
Votre description suppose que int * code> et
char * code> Les pointeurs ont la même taille et la même présentation, mais le comportement visible du programme ne le fait pas. La standard C garantit que tout objet est accessible en tant que réseau de caractères. Le code de l'OP accédera donc au premier octet (adressé le plus bas) de
i code>. La valeur de cet octet, comme d'autres l'ont souligné, dépend de la mise en œuvre.
@Keiththompson Pourquoi est-ce que la diffusion est nécessaire, quelle est la différence entre char * p = (char *) & i code> et
char * p = & i code>?
Pourquoi est-il nécessaire, quelle est la différence entre char * p = (char *) & i code> et
char * p = & i code>?
@Surajjain: La différence est que char * p = (char *) & i; code> Islegal et
Char * p = & I; code> n'est pas. Il n'y a pas de conversion implicite entre
char * code> et
int * code> (bien que certains compilateurs puissent le permettre, de préférence avec un avertissement). Les conversions du pointeur peuvent être dangereuses, vous permettant de traiter un objet d'un type comme s'il s'agissait d'un autre type, la langue nécessite donc de telles conversions pour être explicites.
@Keiththompson Si le compilateur le permet avec une guerre, comme "l'initialisation de type incompatible", sont-ils identiques, ils se comportent-ils même. Cela me dérange depuis longtemps.
@Surajjain: Les premières versions de C étaient plus laxistes sur des conversions implicites. Les règles ont été resserrées par la norme ANSI de 1989, mais de nombreux compilateurs permettent de telles conversions pour éviter de casser l'ancien code. Char * p = & I; code> est une violation de contrainte, nécessitant un diagnostic. Ce diagnostic (malheureusement, IMHO) peut être un avertissement non mortel. Il n'est pas clair si le comportement est défini ou non. Vous devez prendre des avertissements au sérieux; Traitez-les comme des erreurs fatales, sauf si vous êtes sûr que votre code a raison et que le compilateur est faux.
@Keiththompson OK, monsieur, pouvez-vous vérifier cette question, j'ai demandé ce long retour, je lui ai répondu quand les choses étaient claires pour moi, je veux juste m'assurer que je n'éside personne. Stackoverflow.com/questions/34826036/...