1 210 42 210
3 Réponses :
Eh bien, si je voulais diviser les cheveux: En premier lieu, le code invoque un comportement indéfini sur la place, tout au long des déclarations Le reste n'est que la spéculation. Supposons que votre système soit raisonnable et numériquement fort> la valeur du pointeur MAINTENANT, puis En outre: printf () code>. La différence de deux pointeurs a type ptrdiff_t code>, et pour cela, le spécificateur de conversion correct est % TD code>, pas % d code>. P>.
& arr code> est toujours identique, quel que soit le type à convertir. P>
(& Ar + 1) - & ARR CODE> est 1, bien sûr, selon les règles du pointeur arithmétique. (La différence réelle entre les deux pointeurs est 210 * Tailleofof (int) code> octets, mais ce n'est pas des mathématiques de l'école, mais du pointeur arithmétique, c'est pourquoi le résultat est donné en unités de taille Taillef (t ) code>, où t code> est le type de base du pointeur.) p>
(char *) (& ar + 1) - (char *) & ar code> jette les pointeurs sur char * code>, et depuis la taille de Char < / Code> est 1, cela imprimera la différence printf ("% d \ n", (non signé) (ARR + 1) - (non signé) Ar) code> soustrait deux pointeurs de type int (*) [7) [7) [ ] [6] code>. C'est ce que arrondi code> se désintègre. Bien sûr, 7 * 6 = 42, donc la différence de taille entre arr + 1 code> et arr code> est de 42 éléments. P>
p code>, cependant, ce n'est pas un pointeur sur le premier élément de la matrice, mais c'est un pointeur sur le tableau lui-même. Son type est correctement désigné comme int (*) [5] [6] [7] code>. Maintenant, si vous imprimez la différence en utilisant non signé code>, alors vous obtiendrez 5 * 6 * 7 code>, qui est 210. p>
Celui qui a baissé, laissez un commentaire. Je ne vois aucune raison pour un bowvote.
La réponse est mal écrite et n'explique pas les types impliqués. Ensuite, la réponse est écrite de manière à effectuer de véritables déclarations et à montrer, mais pas à enseigner des concepts à quelqu'un qui ne les comprend pas. En outre, la conversion en Char * code> et soustraire ne résout pas ou abuser du pointeur arithmétique; Il est entièrement défini par la norme C.
in dans dans Etant donné que dans comme un de côté: p>
Le type de Le type de Le type de Le type de (& arr + 1) - & arr code>: p>
& ar code> est l'adresse d'un tableau de 5 tableaux de 7 tableaux de 6 Char code>. L'ajout d'un produit produit l'adresse de l'endroit où le tableau Char code> serait, si nous avions un tableau de ces objets au lieu d'un seul. Soustrayez l'adresse d'origine, & ARR CODE>, produit la différence entre les deux adresses. Pour la norme C, cette différence est exprimée en tant que nombre d'éléments entre les deux adresses, où le type d'élément est le type d'objet pointé sur. Étant donné que ce type est un tableau de 5 tableaux de 6 tableaux de 6 Char code>, la distance entre les deux adresses est un élément. En d'autres termes, la distance entre & arr code> vers (& arr + 1) code> est Char code>. p>
(char *) (& arr + 1) - (char *) & ar code>: p>
& arr + 1 code> est à nouveau un pointeur sur l'endroit où la prochaine matrice de 5 tableaux de 7 tableaux de 6 Char code> serait. Lorsqu'il est converti en un char * code>, le résultat est un pointeur sur quel serait le premier octet de ce prochain tableau. SimpleLLY, (char *) etr code> est un pointeur sur le premier octet du premier tableau. Ensuite, soustrayez les deux pointeurs génère la différence entre eux dans des éléments. Étant donné que ces pointeurs sont pointus sur char code>, la différence est produite en tant que numéro de char code>. La différence est donc le nombre d'octets dans une matrice de 5 tableaux de 7 tableaux de 6 char code>, qui est 5 • 7 • 6 Char code> ou 210 Char code>. p>
(non signé) (arr + 1) - (non signé) Art code>: p>
Art code> n'est pas utilisé avec & code> (ou Tailleof code> ou d'autres cas exceptionnels), il est automatiquement converti à partir d'un tableau de 5 tableaux de 7 tableaux de 6 Char code> à un pointeur sur le premier élément. Ainsi, il s'agit d'un pointeur d'un tableau de 7 tableaux de 6 Char code>. Ensuite, arr + 1 code> est un pointeur sur la matrice suivante de 7 tableaux de 6 Char code>. Lorsque cette adresse est convertie en non signé code>, le résultat, dans la mise en œuvre de C que vous utilisez, est en effet l'adresse de la mémoire de l'objet. (Ceci est commun mais n'est pas garanti par la norme C et se casse certainement lorsque les adresses sont de 64 bits, mais non signé code> est de 32 bits.) De même, (non signé) arr compte code> est l'adresse du premier objet. Lorsque les adresses sont soustraites, le résultat est la distance entre eux en octets. La différence est donc le nombre d'octets dans une matrice de 7 tableaux de 6 Char code>, qui correspond à 7 • 6 octets, ou 42 octets. Notez la différence de clé dans ce cas: & ar code> est un pointeur sur une matrice de 5 tableaux de 7 tableaux de 6 Char code>, mais ARR code> est un Pointeur sur une matrice de 7 tableaux de 6 Char code>. P>
(non signé) (p + 1) - (non signé) p code>: p>
p code> est un pointeur sur une matrice de 5 tableaux de 7 tableaux de 6 Char code>. Ensuite, p + 1 code> est un pointeur sur l'endroit où le tableau suivant serait. Convertir en non signé code> actes comme décrit ci-dessus. La soustraction donne la différence d'octets d'octets, de sorte qu'il est de la taille d'un réseau de 5 tableaux de 7 tableaux de 6 char code>, de sorte que c'est à nouveau 210 octets. P>
(& arr + 1) - & ar code> est ptrdiff_t code> et doit être imprimé avec % TD code>. P>.
(char *) (& arr + 1) - (char *) & ar code> est ptrdiff_t code> et doit être imprimé avec % TD code >. p>
(non signé) (arr + 1) - (non signé) Art code> est non signé INT code> et doit être imprimé avec % u code> . p>
(non signé) (p + 1) - (non signé) p code> est non signé INT code> et doit être imprimé avec % u code> . p>
@Grijeshchauhanhan: Les ajouts, les soustractions et les conversions vers Char * Code> dans ce code sont définis. Les conversions sur non signé code> ne sont pas complètement définies mais se sont bien comportées dans des implémentations typiques C à condition que les adresses résultantes soient dans les limites du type code> non signé. L'utilisation de spécificateurs de format incorrects n'est pas défini.
Merci!! Je l'ai eu maintenant, j'ai lu cette section de votre réponse à nouveau (j'ai voté 2e). Mais ma limite de vote de commentaire croisée. Merci
Remarque type Vérifiez ce code de travail chez CODEPADE : P> & Art Code> est une adresse complète de tableau de caractères 3 dimensions, alors que Arr code> pointe sur le premier élément de charme 2 dimensions. Quelque chose comme ci-dessous dans le diagramme: & arr code> est char (*) [5] [7] [6] code> qui est Adresse de Char 3D-Tableau de dimension [5] [7] [6] code>.
Différence de valeur-sage entre & Arr code> et etr + 1 code> est 5 * 7 * 6 * Tailleof (char) code> = 210 code >.
Parce que la taille de Char [5] [7] [6] code> est 5 * 7 * 6 * Taille de (char) code>.
Dans votre code & ARR CODE> Points sur une matrice 3-D et & Arry + 1 Code> Le tableau 3-D suivant (qui n'existe pas dans notre code). P> Char : 1
Char[5] : 6
Char[5][7] : 42
Char[5][7][6]: 210
Vérifiez ce Diagramme
@Alex Essayez votre code à nouveau avec chaque typecase cette fois: (char (*) [5] [7] [6]) code>. Par exemple: printf ("% d \ n", ((char (*) [5] [7] [6]) (ARR + 1) - ((Char (*) [7] [7] [ 6]) ARR); code> et dire la raison de la sortie.
Astuce:
6 * 7 = 42 code>,5 * 7 * 6 = 210 code>@Armin pouvez-vous s'il vous plaît expliquer?
Un autre indice - vous ne convertissez pas l'adresse en un type différent jusqu'à ce que après i> vous avez déjà fait l'arithmétique sur les pointeurs, qui est fait en supposant le type d'origine, pas le type final ...
@Twalberg pour quel exemple serait-ce vrai, sûrement pas pour les trois derniers.
@Armin Ceci est vrai de tous les trois derniers exemples ci-dessus, en raison des règles de préséance de l'opérateur -
(char *) (& ar + 1) code> Par exemple, sait quearrondi code> est unchar [5] [7] [6] code>, ce qui signifie que& arr + 1 code> estarr + 5 * 7 * 6 code> ou < code> arr + 210 code>, qui est ensuite coulé sur unchar * code> -(char *) (arr) + 1 code> serait le moyen de convertirARR code> à unChar * code> Avant que l'arithmétique est terminé.@Twalberg Tu as raison. Je regardais quelque chose d'autre et complètement sans importance.