2
votes

Problème de sortie du pointeur en C ++

J'essaye d'exécuter ce code de programme C ++ dans TurboC ++

    {Via printf}    &a=FFF2,p=FFF2                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fff2                                      
    {Via printf}    &a=FFF2,p=FFF6                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fff6                                      
    {Via printf}    &a=FFF2,p=FFFA                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fffa                                      
    {Via printf}    &a=FFF2,p=FFFE                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fffe                                      
    {Via printf}    &a=FFF2,p=0002                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870002                                      
    {Via printf}    &a=FFF2,p=0006                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870006                                      
    {Via printf}    &a=FFF2,p=000A                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87000a                                      
    {Via printf}    &a=FFF2,p=000E                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87000e                                      
    {Via printf}    &a=FFF2,p=0012                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870012                                      
    {Via printf}    &a=FFF2,p=0016                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870016

Maintenant, la sortie de ce programme est la suivante:

    #include<iostream.h>
    #include<stdio.h>
    #include<conio.h>
    void main()
    {clrscr();
     int i;
     long int a=10,*p;
     p=&a;
     for(i=0;i<10;i++)
     {printf("\n{Via printf}\t&a=%p,p=%p",&a,p);
      cout<<"\n{Via cout}\t&a="<<&a<<",p="<<p;
      p=p+1;
     }
     getch();
    }

Je sais que 0x (c'est-à-dire, la sortie p via cout) désigne un non hexadécimal. ,
aussi ses quatre derniers chiffres indiquent sa valeur stockée,
mais que signifie 8f87 (ses troisième, quatrième, cinquième et sixième chiffres)?


11 commentaires

Le nombre est composé de tous les chiffres. BTW p = p + 1; incrémente le pointeur, pas ce qu'il pointe.


C'est peut-être la partie segment de l'adresse?


Rappel obligatoire que Turbo C ++ est horriblement obsolète. Obtenez un compilateur de ce siècle si vous le pouvez.


Conseil: n'utilisez pas TurboC (qui est plus ancien que vous). Nous sommes au 21e siècle et il existe de bien meilleures alternatives.


... et TurboC utilise un modèle de mémoire segmenté que personne n'a utilisé depuis des décennies. Croyez-moi, vous ne voulez pas connaître les détails.


Je me demande si un nouveau cours est en cours: stackoverflow.com/questions/55180062/...


Plus que vous voulez savoir: stackoverflow.com/questions/14159971/...


@Jabberwocky, veuillez me suggérer un bon compilateur ...


Avez-vous google?


@Jabberwocky Non (car google me fournira de nombreuses options); Je vous ai posé la question car vous êtes contre TCPP et avez une bonne réputation


@suresh technotification.com/2019/03/…


4 Réponses :


2
votes

L'adresse entière du pointeur est sortie en hexadécimal, pourquoi printf et cout sortent des valeurs différentes est un problème d'implémentation.

C'est où vos données sont stockées, elles n'ont rien à voir avec la valeur de ces données:

long int a=10,*p;
p=&a;
&a; // where that data is stored
p; // where that data is stored
a; // value of that data
*p; // value of that data


0 commentaires


0
votes

N'essayez pas d'interpréter les valeurs des pointeurs, sauf si vous écrivez des pilotes matériels.

En général, les pointeurs ne sont que des nombres de 32 ou 64 bits qui indiquent un octet en mémoire. Selon le système sur lequel vous exécutez, vous obtiendrez des valeurs différentes. Vous ne devriez jamais vous soucier de la valeur réelle du pointeur. Veillez à ce que l'adresse vers laquelle elle pointe soit valide (non nulle, et les données n'ont pas été supprimées).

Les bons programmes fonctionneront quelle que soit la façon dont la mémoire est allouée.

La différence entre printf et cout est probablement due à la façon dont ils sont implémentés. TurboC ++ est ancien à tous égards, donc je ne peux pas vous donner une réponse complète sur pourquoi vous voyez la différence.

Une exception notable concerne les interactions de bas niveau avec les pilotes mappés en mémoire. Cela fonctionne généralement en mappant une certaine plage d'adresses à certains périphériques matériels et la modification des données dans ces plages indiquera au matériel d'effectuer certaines actions.


0 commentaires

2
votes

printf et cout impriment la valeur du pointeur.

printf imprime simplement la partie offset, tandis que cout imprime à la fois le segment et la partie offset du pointeur (même si segment n'a pas de sens, comme dans certains modèles de mémoire, segment n'est pas stocké dans le pointeur. Dans ce cas, la valeur d'un registre de segment est imprimée, peut-être DS ).

0x8f87fff2 peut être divisé en segment: notation offset: 8f87: fff2, où 8f87 est le segment et fff2 est l'offset.


0 commentaires