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 :

le fonctionnement interne des variables


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut le fonctionnement interne des variables
    Bonjour,

    C'est juste une question de "cours" mais j'ai entendu dire qu'une simple variable fonctionnait comme un pointeur de manière interne.
    Par exemple quand on fait :
    Que se passe-t-il en interne ?
    n est un pointeur ? Ce qui se passe en gros c'est ceci :
    Non ?

    Merci bonne journée. Cordialement, Gizmo.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Non.

    Ça c'est du C++, pas du C. Et ça m'a surtout l'air d'être une mauvaise interprétation dérivée du langage Java qui, lui-même, est très différent du C et du C++.

    Lorsque tu définis une variable locale, son espace est réservé dans la pile par le compilateur, c'est-à-dire que ton compilo sait à l'avance quelle est la position de ta variable dans la pile par rapport au cadre de pile courant. Et le code en langage machine généré est écrit pour aller directement exploiter cette adresse mémoire : tous les noms de symboles ou autres auront disparu une fois ton exécutable produit.

    Un pointeur « int * n », maintenant, est une variable comme une autre. Elle est gérée exactement comme celle que l'on vient de présenter.

    En C++, Lorsque tu fais new, c'est un peu l'équivalent de malloc() en C. Tu fait appel aux services d'une bibliothèque standard qui réserve de la place de façon dynamique et cet appel renvoie donc l'adresse en mémoire de cette place. Il est donc normal que tu la stockes dans un pointeur. Il faudra également la libérer explicitement, puisqu'il s'agit d'une ressource réclamée par ton programme et pas gérée à l'avance par le compilateur.

    En Java, maintenant, maintenant, ton programme compilé en bytecode est interprété par la JVM, c'est-à-dire un programme sous-jacent qui, lui, fait pour toi tout ce que tu fais en C. Dans ce langage, toutes les instances déclarées de la sorte sont en fait des « références » à des objets. Tu crées le symbole mais il ne correspond à rien par défaut, ensuite tu crées explicitement une instance d'un objet quelconque et tu l'associe à ce symbole avec « = ». Tant et si bien que la plupart du temps, tu ne dupliques jamais l'objet (mais tu multiplies ses références) et tu ne le compares pas par valeur mais tu regardes si deux symboles référencent bien le même objet ou pas. C'est tout le contraire en langage C.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    D'accord en fait une variable n'est pas un pointeur alors... Il m'a semblé pourtant avoir vu quelque part qu'une variable était en fait un pointeur.
    Pardon pour le new c'est du c++ mais c'était pour demander le principe.
    Pourtant quand on fait La variable se crée bien n'importe où dans la mémoire, et quand on assigne quelque part dans le source une valeur à n il sait bien à quel endroit exact de la mémoire chercher.
    La mémoire fonctionnant avec des adresses 0x0001--- , la variable n n'utilise-t-elle pas une adresse mémoire en interne ? Si oui comment ?

    Merci d'avance bonne fin de journée. Cordialement, Gizmo.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Relis bien mon commentaire, la réponse s'y trouve déjà.

    Pourtant quand on fait La variable se crée bien n'importe où dans la mémoire, et quand on assigne quelque part dans le source une valeur à n il sait bien à quel endroit exact de la mémoire chercher. La mémoire fonctionnant avec des adresses 0x0001--- , la variable n n'utilise-t-elle pas une adresse mémoire en interne ? Si oui comment ?
    Si bien sûr. Si ce qui t'intéresse, c'est obtenir cette adresse en mémoire, on utilise « &n », qui renvoie bien une valeur de type « int * », soit « pointeur sur un entier ». Si tu veux enregistrer cette valeur, il faudra bien le faire dans une autre variable, donc dans un « pointeur ». L'ambiguïté vient du fait qu'on utilise le même mot pour désigner l'adresse mémoire elle-même quand c'est celle de quelque chose d'identifié (« renvoyer un pointeur ») et la variable qui la contient (« déclarer un pointeur »).

    Ce pointeur, s'il contient l'adresse de n, existe lui-aussi en mémoire et a donc une adresse. l'expression « &ptr » (en supposant qu'il s'appelle ainsi), sera donc de type « int ** », soit « pointeur sur un pointeur sur un entier ».

    En fait, au sens strict, une « variable » est un terme d'une expression mathématique dont la valeur peut varier. Maintenant, pour émuler doit réserver de la mémoire pour contenir sa valeur à l'exécution. Et par conséquent, pour les programmeurs, « déclarer une variable » est souvent synonyme de « réserver une case mémoire » alors qu'en fait, il s'agit bien de deux actions différentes et que le lien entre les deux n'est en fait qu'une relation de cause à effet.

    Au passage, le terme exact (et le plus approprié) pour désigner une petite zone de mémoire qui maintient une valeur d'un état à un autre est « registre », mais la plupart des gens associent directement ce mot avec les « registres du processeur » qui n'en sont pourtant que des cas particuliers.

    Pour revenir à ce que l'on disait, maintenant, lorsque tu fais référence à une variable dans ton code source, c'est le compilateur qui va se débrouiller pour générer du code qui écrive au bon endroit. Donc, bien sûr, il va devoir déduire une adresse en mémoire. Mais cette adresse est connue à l'avance, au moins de manière indirecte, par exemple par rapport au pointeur de pile.


    Merci d'avance bonne fin de journée. Cordialement, Gizmo.
    À ton service.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé d'avoir fait répéter et merci pour l'explication.
    C'est une simple question pour savoir le pourquoi du comment.
    Les grands principes de la programmation ça peut aller (quoique je ne sais et ne saurai jamais tout) mais dès qu'on commence à gratter un peu pour comprendre certains principes on peut vite sortir du circuit si on n'est pas un pilote expérimenté.

    Bonne soirée à vous. Cordialement, Gizmo.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Les grands principes de la programmation ça peut aller (quoique je ne sais et ne saurai jamais tout) mais dès qu'on commence à gratter un peu pour comprendre certains principes on peut vite sortir du circuit si on n'est pas un pilote expérimenté.
    Ah, mais c'est comme ça qu'on devient un pilote expérimenté ! Et c'est tout à ton honneur.

    À bientôt.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ah, mais c'est comme ça qu'on devient un pilote expérimenté !
    Mais je suis un pilote expérimenté... de Citroën 2-Chevaux

    Merci à bientôt. Cordialement, Gizmo.

Discussions similaires

  1. le fonctionnement interne des outil d'execution des tests
    Par geforce dans le forum Développement Web en Java
    Réponses: 11
    Dernier message: 15/01/2010, 13h41
  2. Bonnes pratiques d'optimisation JS et gestion interne des variables
    Par nouknouk dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/11/2009, 14h42
  3. Réponses: 4
    Dernier message: 11/11/2007, 15h00
  4. Réponses: 2
    Dernier message: 30/12/2006, 10h50
  5. Fonctionnement interne des outils de gestions de paquets
    Par Spoutnik dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/03/2006, 13h52

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