Je pense que je n'ai pas bien compris , mais je pose la question quand même . Pas Taper svp.
voila ,
"créez-et-initialisez-des-pointeurs" la première leçon sur les pointeurs.
Je rencontre un soucis dans le cours comme dans le livre ; il est indiqué comme exemple :
int age = 10;
int *pointeurSurAge = &age;
printf("%d", pointeurSurAge);
//le printf doit renvoyer :
177450 //sensé si je comprend être l'adresse de la variable age
hors je test sur mon ordinateur et les résultat a cette manipulation me donne des résultats qui n'ont rien a voir avec du Hexadécimal. La seul solution pour palier a cela est d'indiquer %p au lieu du %d comme mentionné dans le cours.
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char*argv[])
{
int variable = 10;
printf("Valeur Variable = %d\n",variable);
printf("Adress Variable =%p\n",&variable);
int *pointeur;
pointeur = &variable;
printf ("Adress de la variable du pointeur est %p\n",pointeur);
printf ("valeur contenu dans le pointeur est %d\n",*pointeur);
return 0;
}
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Qui plus est, on est censé convertir l'adresse en void*
printf ("adresse = %p\n", (void *) &ma_variable);
parce que les pointeurs ne sont pas forcément tous de la même taille pour une architecture particulière .... (exemple = adresses dans la Ram / dans une Eprom sur un microcontroleur ; ou far/near pointeurs du bon vieux temps du 8086 (?))
- Edité par michelbillaud 27 janvier 2024 à 15:00:36
Il faut ajouter que l'adresse obtenue dépendra de l'architecture de l'ordinateur, du système d'exploitation, et probablement de la version du compilateur.
Le Tout est souvent plus grand que la somme de ses parties.
Une coquille c'est une faute typographique, là c'est autre chose. Un oubli, volontaire ou pas, ou une erreur. L'auteur du cours
Soit a choisi délibérément de faire une entorse à la norme pour éviter d'avoir à justifier la conversion explicite avec les histoires d'adresses de tailles différentes qui compliquent ;
Soit a oublié, et n'a pas vérifié ses exemples en les compilant avec un maximum d'avertissements
Soit ne connaît pas ce point (emmerdant) du langage C, ce qui ne l'empêche pas de faire des cours, comme si.
En pratique, ne pas convertir avec (void*), ca passe quand même (Ce n'est pas une erreur qui bloque la compilation et ca s’exécute), la plupart du temps, si on programme sur un pc (avec les pointeurs de la même taille), ce qui est la situation d'apprentissage la plus probable.
Dans le premier cas, il aurait fallu une petite note disant qu'en fait il faudrait écrire ceci cela, et qu'on verra plus tard pourquoi. Histoire que le débutant ne soit pas dérouté si il voit des avertissements en compilant.
---
On retrouve ce problème quand on doit passer un pointeur nul à certaines macros ou fonctions (j'ai oublié lesquelles, ça me reviendra peut être) : il faut mettre (void*) 0, au lieu de 0 tout court, parce que les pointeurs ne sont pas forcement de la même taille que les entiers, contrairement à ce qui se passait en C préhistorique (à l'époque, le type void* n'existait pas).
--- Compléments
- si on écrit
printf("Adresse = %p\n", 0);
on se fait engueuler gentiment (si on a mis les options pour avoir les warnings)
gcc -std=c2x -Wall -Wextra a.c
a.c: In function ‘main’:
a.c:7:28: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
7 | printf("Adresse = %p\n", 0);
| ~^ ~
| | |
| | int
| void *
| %d
L'explication (du fait qu'on devrait), c'est lié aux fonctions variadiques (qui ont des paramètres en nombre variable et de types différent). Pour qu'une telle fonction puisse accéder aux paramètres qui lui ont été envoyés, il faut qu'elle en connaisse le type... Et pour garantir que ce qu'on a passé est d'un type compatible, on s'arrange pour avoir le type (void *) qui est compatible avec tout le monde.
---
> @pierrot l'adresse obtenue dépendra de l'architecture de l'ordinateur, du système d'exploitation, et probablement de la version du compilateur.
Explication : la pile des appels (dans laquelle se trouvera la variable) n'est pas installée au même endroit de l'espace mémoire à chaque exécution, pour compliquer la vie des malfaisants. Sa position est aléatoire, c'est l'ASLR (address space layout randomization)
J'avoue avoir imprimé ta réponse afin de voir par la suite si j'arrive a comprendre la totalité de ces explications. Comme je disait , je débute totalement et il y a 1 semaine je ne savais même pas ce qu'était un pointeur.
Personne n'a la science infuse, ça s'apprend et pour ça il faut bien commencer (et c'est pas dit qu'un jour on s'arrêtera d'apprendre)
La difficulté, c'est pas de savoir ce qu'est un pointeur (une donnée qui peut contenir l'adresse d'un truc), mais comment s'en servir pour faire des choses (et correctement : efficacement, pas de fuite mémoire, pas de double libération, pas d'adresses invalides etc)
- Edité par michelbillaud 30 janvier 2024 à 23:05:40
pointeurs (petit incompréhension)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Le Tout est souvent plus grand que la somme de ses parties.