IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

un 'petit' probleme avec les pointeurs


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Points : 19
    Points
    19
    Par défaut un 'petit' probleme avec les pointeurs
    salut!
    Plzzzzzz aidez-moi pour comprendre ce programme ...

    #include<iostream>
    using namespace std;
    int main()
    {
    int *i=new int;
    char *c;
    cout<<sizeof(c)<<endl;//c==4 octet ... pourquoi ?

    *i=0x44434241;//’??!!!!!!!

    c=(char*)i;//ici je pense que nous donne l'adresse de new int a c ??!!
    cout<<"c "<<c<<endl;//Ici le programme affiche les caractéres ABCD... pourquoi ??!!

    cout<<*c<<endl;
    cout<<*(c+1)<<endl;
    cout<<*(c+2)<<endl;
    cout<<*(c+3)<<endl;
    //*c=='A',*(c+1)=='B',*(c+2)=='C',*(c+3)=='D' ... Quelle est la relation entre c et *c,*(c+1),*(c+2),*(c+3) et aussi
    //la taille de c et la taille des int....et des char en ce programme ?!!
    cout<<endl;system("pause");
    }
    --> REMARQUE
    L'auteur de ce programme dit que :"L'analyse de l'exécution de ce programme, montre que les microprocesseurs INTEL rangent
    en mémoire d'abord les poids faibles d'une variable."

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    c == 4 octet ... pourquoi ?
    C'est un fait, une adresse sur les processeurs Intel actuels est représentée sur 4 octets (32 bits) ou 8 octets (64 bits). Là, tu as d'une part un processeur qui utilise 4 octets pour représenter une adresse, et d'autre part un compilateur qui sait générer des programmes pour ce type de processeur.

    *i=0x44434241;//’??!!!!!!!
    i est un pointeur, c'est-à-dire une variable qui contient une adresse. L'expression i = new int permettait de créer un nouvel objet de type int et de stocker l'adresse de cet objet dans i. Sur ton processeur, un int fait aussi probablement 4 octets. L'instruction *i = 0x44434241; place la valeur 0x44434241 dans l'objet de type int pointé par i. Remarque bien que cette instruction modifie l'objet pointé, pas i. i garde toujours sa valeur (c'est-à-dire : continue à pointer sur le même objet).

    c=(char*)i;//ici je pense que nous donne l'adresse de new int a c ??!!
    On affecte la valeur de i à c. C'est-à-dire qu'après cette instruction, i et c contiennent la même valeur (attention ! un cast peut changer les bits de la valeur castée mais ici, ce changement n'a pas lieu).

    cout<<"c "<<c<<endl;//Ici le programme affiche les caractéres ABCD... pourquoi ??!!
    parce que c est un pointeur de caractère et lorsque cout rencontre un tel pointeur, il va afficher le caractère pointé ensuite tous les caractères suivants (c'est-à-dire ceux qui se trouvent en mémoire après ce caractère), jusqu'à ce qu'il rencontre le caractère de code 0x00 (qui ne sera pas affiché). Comme c et i ont la même valeur, c pointe sur le premier octet (puisque sur les processeurs Intel 1 caractère = 1 octet) de l'entier 0x44434241 (rappelons qu'un int utilise 4 octets). Ce premier octet est 0x41, le deuxième est 0x42, le troisième est 0x43 et le 4ème et dernier est 0x44. Il n'y a pas de pourquoi, c'est juste ainsi que les processeurs Intel organisent les octets en mémoire. C'est aussi ce que le progremme veut mettre en évidence. Comme dans ton système les valeurs 0x41, 0x42, 0x43 et 0x44, lorsqu'on les utilise pour représenter des caractères, représentent respectivement les caractères 'A', 'B', 'C' et 'D'. Le programme est cependant buggé car il fallait prévoir la place pour le caractère de code 0x00 ...

    *c=='A',*(c+1)=='B',*(c+2)=='C',*(c+3)=='D' ... Quelle est la relation entre c et *c,*(c+1),*(c+2),*(c+3)
    c contient une adresse, *c a la valeur de l'objet pointé. c + 1 vaut également une adresse ("l'adresse contenue dans c" + 1), *(c + 1) a la valeur de l'objet pointé, etc.

    Quelle est la relation entre la taille de c et la taille des int....et des char en ce programme ?!!
    Sur les processeurs Intel, les adresses ont tous la même taille. Dans ton cas : 4 octets. La taille de c est donc 4. La taille d'un int est également de 4 octets et celle d'un char de 1 octet. Ce sont des faits, ce ne sont pas des déductions, c'est juste ainsi qu'Intel en a choisi.

  3. #3
    screetch
    Invité(e)
    Par défaut
    c'est un assez mauvais exemple. en particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"c "<<c<<endl;//Ici le programme affiche les caractéres ABCD... pourquoi ??!!
    ceci va "reinterpreter" ce qui est stocké dans un entier (dont la taille, la représentration, etc sont dépendante de l'implémentation) vers une chaine de caracteres, qui en C est une suite de caracteres terminés par un 0. or personne n'a été coller un 0 la dedans, donc le comportement est indéfini.
    on peut expliquer ce que l'auteur souhaitait faire, mais pas ce que le programme fait, car il est codé comme un pied.

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup pour votre aide ... mes professeurs
    Enfin je comprends le programme

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Citation Envoyé par screetch Voir le message
    c'est un assez mauvais exemple. en particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"c "<<c<<endl;//Ici le programme affiche les caractéres ABCD... pourquoi ??!!
    ceci va "reinterpreter" ce qui est stocké dans un entier (dont la taille, la représentration, etc sont dépendante de l'implémentation) vers une chaine de caracteres, qui en C est une suite de caracteres terminés par un 0. or personne n'a été coller un 0 la dedans, donc le comportement est indéfini.
    on peut expliquer ce que l'auteur souhaitait faire, mais pas ce que le programme fait, car il est codé comme un pied.
    Je dirais que ca sent à plein nez l'exercice de cours tordu pondu pour que les élèves comprennent les pointeurs, et en déduisent un max de chose (comme un casse tete !).
    Jamais de la vie j'espère qu'il n'existe de tels programmes dans la nature (ou dans la matrice....) sinon j'ai vraiment froid dans le dos, parce que c'est vrai que c'est codé comme un pied !

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problem avec les pointeurs
    Par Halloula dans le forum C
    Réponses: 3
    Dernier message: 22/01/2007, 16h54
  2. [Débutant] Probleme avec les pointeurs
    Par amira dans le forum C
    Réponses: 14
    Dernier message: 04/12/2006, 14h27
  3. Tout petit probleme avec les string
    Par bixi dans le forum Delphi
    Réponses: 4
    Dernier message: 06/06/2006, 09h46
  4. Petit probleme avec les Border lors d'une sauvegarde
    Par Mike888 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 06/06/2006, 09h33
  5. Petit probleme avec les css
    Par Seth77 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 12/02/2006, 18h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo