Dans le code que tu nous montres l'étoile sert à déclarer la variable pointeurSurAge comme étant un pointeur (sur int dans ton code).
Dans ton code la variable pointeurSurAge2 est déclarée comme étant un entier (int).
A cet entier, tu lui affectes une adresse, comme une adresse est un entier, il l'accepte, mais le compilateur émet un Warningcomme quoi la variable n'est pas adapter pour recevoir une adresse. (Les tailles ne sont pas forcement compatible).
Seule les pointeurs peuvent être affecté avec des adresses !
rouIoude vient de t'expliquer que tu veux mettre une adresse dans un int. Ça risque de ne pas marcher, d'où ton warning. Faire *pointeurSurAge ne peut pas marcher car tu ne l'as pas déclaré comme pointeur.
Le Tout est souvent plus grand que la somme de ses parties.
Dans le code que tu nous montres l'étoile sert à déclarer la variable pointeurSurAge comme étant un pointeur (sur int dans ton code).
Dans ton code la variable pointeurSurAge2 est déclarée comme étant un entier (int).
A cet entier, tu lui affectes une adresse, comme une adresse est un entier, il l'accepte, mais le compilateur émet un Warningcomme quoi la variable n'est pas adapter pour recevoir une adresse. (Les tailles ne sont pas forcement compatible).
Seule les pointeurs peuvent être affecté avec des adresses !
D'accord, je comprends un peu mieux, même si je pense que je devrai m'attarder un peu plus là dessus.
L'exemple de ce cours de qualité fort discutable est artificiel, il est là pour montrer comment on utilise un pointeur. Pas pourquoi on l'utilise.
Comme il n'y a pas d'objectif, il n'y a pas vraiment de raison d'employer un pointeur, et donc de "mettre des étoiles" ou pas. Ça fait des programmes qui - quand le compilateur en veut - affichent un truc, et voilà.
---
Prenons un exemple connu, scanf. Dans
int age;
printf("votre age ?");
scanf("%d", &age);
On est bien d'accord qu'on met & dans le scanf, parce que scanf attend qu'on lui dise à quel endroit il faut ranger la valeur tapée par l'utilisateur.
On donne donc à scanf, comme 2ieme paramètre, l'adresse (et pas la valeur) d'une variable entière. Age est une variable entière, &age est son adresse.
Maintenant si on veut passer par une variable intermédiaire
scanf("%d", adr_entier);
Il faut que adr_entier contienne cette adresse, donc avoir fait
adr_entier = &age;
Et pour ça avoir déclaré adr_entier du type qui va bien.
int *adr_entier;
Il y a une étoile parce que ce n'est pas une variable qui contient un int, mais l'ADRESSE d'un int. Un pointeur d'entier.
Que peut on faire avec cette variable adr_entier, maintenant qu'elle est déclarée ?
Y affecter l'adresse d'un entier. C'est ce qu'on a fait avec adr_entier = &age;
Se servir de sa valeur (Qui est une adresse), c'est ce qu'on a fait dans scanf("%d", adr_entier);
On peut aussi la déréferencer, c'est à dire se servir de l'entier designé par l'adresse contenue dans le pointeur (l'entier pointé)
Exemple
printf("vous avez %d ans\n", *adr_entier);
La notation *, ca dit qu'on fait afficher la valeur de l'entier pointé, pas la valeur du pointeur.
---
Donc deux usages de l'étoile
Dans la déclaration du pointeur
Lors de son déréférencement.
Ce n'est pas un hasard. Un des principes de conception de C, c'est que la déclaration d'une variable ressemble à son utilisation.
Ici,
int *adr_entier;
Ca raconte que *adr_entier s'utilise comme un int.
Si on déclarait
int *p[10];
Ça raconterait que p est un tableau de 10 pointeurs d'entier. Pour manipuler un de ces entiers on ferait
En espérant que ceci va éclairer et non assombrir ... - #include <stdio.h> int main(void) { int age = 42; int *ptr = &age; printf("%d\n", age); // valeur de age directement printf("%d\n", *ptr); // Valeur de age par le pointeur. printf("%p\n", ptr); // Valeur de ptr = adresse de age. printf("%p\n", &ptr); // Adresse du pointeur ptr. } - 42 42 000000000061fdec 000000000061fde0
Le Tout est souvent plus grand que la somme de ses parties.
Un pointeur, c'est fait pour pointer. Tu as affiché l'adresse du pointeur, mais pas l'éventuelle valeur pointée. C'est là où il y a vraiment une différence.
Si je fais ça :
#include <stdio.h>
int main(void)
{
int x = 34 ;
// 1) D'abord un vrai pointeur
int *p1 ;
p1 = &x ; // on le fait pointer sur x
printf("Valeur du pointeur : %p\n", p1) ;
printf("Valeur pointée : %d\n", *p1) ;
// 2) Ensuite un faux pointeur
int p2 ;
p2 = &x ; // on le fait pointer sur x
printf("Valeur du pointeur : %p\n", p2) ;
printf("Valeur pointée : %d\n", *p2) ;
}
ça ne compile pas : il refuse la dernière ligne.
Ainsi, même s'il peut servir (aux warnings près) à stocker une adresse, un entier ne peut pas servir à pointer.
(Chez moi ça ne donne pas la même chose : 0x7ffced5b0218 puis 0xed5b0218. Apparemment le pointeur a plus de chiffres.)
- Edité par robun 27 mars 2022 à 14:49:08
Question sur les pointeurs
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.