Bonjour,
Quand on écrit, ça signifie quoi et es ce que l'écriture est correcte ?
Code:
1
2 int *p; p = 12;
Version imprimable
Bonjour,
Quand on écrit, ça signifie quoi et es ce que l'écriture est correcte ?
Code:
1
2 int *p; p = 12;
cela signifie que l'on déclare un pointeur d'entier.Code:int *p
Cela ne compile pas -> il faut mettre ; à la fin.
Ce pointeur n'étant pas initialisé il pointe à priori n'importe où.
Là, le pointeur pointe à l'adresse 12... je doute que cela corresponde à votre besoin...Code:p = 12;
Merci la réponse.Citation:
Envoyé par Bayard
j'en ai pas besoin, c'est juste pour comprendre.
j'ai corrigé le ";"
12 c'est pas une adresse ? ou c'est l'adresse de l'entier 12 ?
A la compilation : test.c:27: attention : assignment makes pointer from integer without a cast
12 est une expression constante. Elle n'a pas d'adresse. C'est un entier de type int.Citation:
Envoyé par oranoutan
D'autre part, un pointeur est une variable conçue pour recevoir une valeur de type adresse du type défini :
ici, int.Code:int *p;
signifie que tu cherches à assigner une valeur de type int à une variable qui attend l'adresse d'un entier. C'est incohérent et le compilateur le signale :Code:p = 12;
"Attention, l'assignation transforme un entier en pointeur (adresse) sans conversion explicite."Code:test.c:27: attention : assignment makes pointer from integer without a cast
Il est en effet techniquement possible si on sait ce qu'on fait, de convertir un entier en adresse à l'aide d'un opérateur de conversion de type (typecast ou cast)
Mais il faut que l'adresse 12 ait un sens sur la machine donnée, ce qui n'est évidemment nullement garanti (comportement dépendant de l'implémentation).Code:p = (int *) 12;
ok merci, pratique l'auto résolu :)
Bonjour,
Encore une ptite question, lequel affiche l'adresse de p, car tout 2 renvoies des valeurs différentes :
Code:
1
2
3
4
5 int *i,j; j=12; i=&j; printf("%p", i); printf("\n%p", &i);
n'existe pas comme format d'affichage (du moins je ne le trouve pas dans le K&R). Où avez-vous trouvé cela ?Code:"%p"
Il est possible de faire un "%ld" pour affichez un mot long en décimal.
ici par exemple http://fr.wikibooks.org/wiki/Programmation_C_Pointeurs
mais on le retrouve un peu partout, il sert afficher l'adresse hexa d'une variable.
OK autant pour moi.
Je n'ai jamais eu à afficher d'adresse.
Pour info
affiche l'adresse du pointeur: l'adresse de l'adresse. Ce n'est pas pareil.Code:printf("\n%p", &i);
Ca se serait donc l'adresse ou débute le contenu de j, si j'ai bien comprisCode:printf("\n%p", i);
D'abord c'est i et pas j.
Ensuite, i est un pointeur.
Ce pointeur est une variable.Code:int *i;
Cette variable est a une adresse. C'est &i.
je faisait référence du j de l'exemple au dessus :
Citation:
Envoyé par oranoutan
K&R2 7.2 Page 152.Citation:
Envoyé par Bayard
Il sert à afficher une adresse. Point. Le format dépend de l'implémentation.Citation:
Envoyé par oranoutan
Bon alors quand je montre un exemple, on est prié de le respecter ou de poser une question si on ne comprend pas. C'est :Citation:
Envoyé par oranoutan
Nommer un pointeur 'i' est une très mauvaise idée... En tout cas c'est très confusant.Code:
1
2
3 printf ("%p\n", (void *) i); printf ("%p\n", (void *) &i);
Sans parler de règles, disons qu'il y a des conventions basées sur le simple bons-sens...
http://emmanuel-delahaye.developpez....ge.htm#nommage
Oui. N'étant pas spécialiste du crypto-code ni de l'IOCCC, j'aurais fait comme ceci :Citation:
Envoyé par oranoutan
Il n'y a absolument rien qui oblige à écrire du code incompréhensible...Code:
1
2
3
4
5
6
7
8
9
10
11
12 int i, int *pi; i = 12; pi = &i; printf ("Valeur de i = %d\n", i); printf ("Adresse de i = %p\n", (void *) &i); printf ("Valeur de pi = %p\n", (void *) pi); printf ("Adresse de pi = %p\n", (void *) &pi); printf ("Valeur de *pi = %d\n", *pi);
Effectivement c'est beaucoup plus clair écrit comme ceci.Citation:
Envoyé par Emmanuel Delahaye
Par contre je ne comprend pas trop l'utilité de caster "pi" étant donné que c'est déjà un pointeur.
Oui je viens d'en prendre connaissance, je vais m'éforcer de suivre ces régles.Citation:
Envoyé par Emmanuel Delahaye
Pour une fonction on écrirai plutôt comment :
Code:
1
2
3 void mafonction_f(void) ou void mafonctionf(void)
C'est un type (int *), or "%p" attend un type (void *). Faut pas contrarier la norme...Citation:
Envoyé par oranoutan
Non. le _f est pour les types fonctions (notions assez avancée). Pour les fonctions ordinaires, un simple nom en minuscule exprimant une action suffit (verbe ou substantif).Citation:
Pour une fonction on écrirai plutôt comment :
Code:
1
2
3 void mafonction_f(void) ou void mafonctionf(void)
et une chaîne s'écrirait ?
Citation:
char *s_machaine
Oui... Mais un char n'est pas une chaine. C'est peut être un pointeur de chaine...Citation:
Envoyé par oranoutan