Pointeur générique (void *)
Bonjour,
Soit le code ci-dessous :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <stdio.h>
void *essai1(void *p)
{
void **q = (void **)p;
return (*q);
}
void *essai2(void *p)
{
double **q = (double **)p;
return (*q);
}
int main(void)
{
{/* 1er exemple */
int x = 4;
int *a = &x;
printf("a=%p\n", (void *)a);
printf("*p=%p\n", essai1(&a));
printf("*p=%p\n\n", essai2(&a));
}
{/* 2eme exemple */
char *a = "abCd";
printf("a=%p\n", a);
printf("*p=%p\n", essai1(&a));
printf("*p=%p\n\n", essai2(&a));
}
return 0;
} |
[Dans essai2, j'ai mis le type double comme j'aurais pu mettre n'importe quel autre type.] Pour chaque exemple, les adresses qui s'affichent sont identiques. Ma question est : les fonctions essai1 et essai2 ou tout autre fonction similaire me renverront-elles toujours a, quel que le type de l'objet vers lequel a pointe ?
Merci,
Candide
Encore une petite question svp
Bonsoir Emmanuel et merci de ta réponse.
Citation:
Envoyé par Emmanuel Delahaye
Oui. Ton code est inutilement compliqué et il manque des choses ...
Ah ! rien ne t'échappe ! En effet, j'avais crû que l'abscence du cast en void ** et double ** m'envoyait un warning.
Pour les parenthèses inutiles après le return, OK. Je suppose que le manque auquel tu fais allusion est le const mais je ne vois pas en quoi c'est obligatoire, c'est des habitudes de bonne programmation, non ? ou j'ai manqué quelque chose d'important ?
Sinon, encore une petite confirmation si possible. Je me lance dans l'écriture de programmes génériques et tout n'est pas encore bien clair. Par exemple, je dispose d'un tableau de pointeurs vers des "données" (de type et de taille inconnus a priori) et je passe ce tableau en argument à une fonction ayant en paramètre un pointeur sur void. Dans cette fonction, j'ai besoin de récupérer l'adresse des données (que je fais passer ensuite à une fonction-callback). D'où mon interrogation toute bête dans le programme tout bête suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h>
void *essai(void *p)
{
char **char_p = p;
return *(char_p + 1);
}
int main(void)
{
int a = 2007, b= 22;
int *t[2];
t[0] = &a;
t[1] = &b;
printf("adresse de b = %p \n", (void *)t[1]);
printf("adresse retournee %p\n", essai(t));
return 0;
} |
C'est bien normal et portable que les mêmes adresses s'affichent, n'est-ce pas ? J'utilise le type char dans ma fonction essai mais n'importe quel type donnerait la même réponse, est-ce bien ainsi ?
Merci encore,
Candide