Bonjour
j'aimerai bien savoir comment déréférencer un "pointeur sur tableau" et un "tableau de pointeur".
Merci
-----
05/09/2013, 11h32
#2
bisou10
Date d'inscription
janvier 2012
Messages
1 134
Re : Pointeurs [langage C]
C'est à dire ? C'est toi qui type tes variables, donc c'est toi qui sait.
Dans les 2 cas les désignations peuvent être identiques selon le contenu de ton tableau void **tab ou &tab[0], ou (void*)tab[0]; pour gagner en lisibilité, tu peux créer une struct ou un enum pour ton tableau.
Note bien que c'est souvent le cas en C, où tu peux caster tout le temps.
05/09/2013, 16h22
#3
invite805ff73c
Date d'inscription
janvier 1970
Messages
517
Re : Pointeurs [langage C]
Bon, donne un exemple et ça sera peut-être plus clair. (@ee94)
Note bien que c'est souvent le cas en C, où tu peux caster tout le temps.
Attention: Un cast c'est une arme, en effet elle inhibe toute les possibilités de contrôle du code qu'a le compilateur en lui imposant quelque chose. Son emploi est, à de très rares exceptions près, réservé aux programmeurs confirmés qui peuvent justifier précisément le pourquoi du comment. Utilisé par un débutant pour "faire fonctionner" son code un cast cache dans la grande majorité des cas une ou plusieurs erreurs de programmation ou de conception.
Encore une fois: Un exemple et on vera.
06/09/2013, 08h39
#4
invitef86a6203
Date d'inscription
janvier 1970
Messages
5 247
Re : Pointeurs [langage C]
Le terme "déréférencer" n'existe pas en C
Il existe un "reference manual" qui est une sorte de dictionnaire décrivant les fonctions disponibles d'un language informatique
Sur google une recherche de "reference manual c++" donne des exemples
Les pointeurs sont d'abord déclarés
ex:
pointeur simple
char *Msg;
ou en tableau
char *Msg[20];
ou en pointeur de pointeur
char **PtrMsg;
Les pointeurs doivent ensuite, soit être une copie d'une adresse existante;
char *Msg;
char MyMsg[20];
strcpy(MyMsg,"Hello !");
Msg=MyMsg;
soit être alloué;
avec malloc() ou autres fonctions dérivées de alloc() comme farmalloc()...
ex:
char *Msg;
Msg = malloc(20);
if (Msg==NULL) Error(ErMalloc);
Une fois utilisé on peut libérer cette mémoire avec free()
ex:
char *Msg;
Msg = malloc(20);
if (Msg==NULL) Error(ErMalloc);
...
if (Msg<>NULL) free(Msg);
idem pour le pointeur de pointeur qui pointe un tableau de pointeur
char **Msg;
char *MyPtr[20];
for (i=0 ;i<20; i++) {
MyPtr[i] = malloc(20);
if (MyPtr[i]==NULL) Error(ErMalloc);
}
....
Msg = MyPtr;
for (i=0 ;i<20; i++) {
if (Msg[i]!=NULL) free(Msg[i]);
}
On ne doit pas libérer une zone qui a un pointeur NULL , ce que renvoit le malloc en cas d'erreur !
Ces fonctions doivent être utilisées avec modérations car la gestion du malloc n'est pas performante.
Une utilisations intenses va vite consommer toute la mémoire car chaque allocations cherche une zone mémoire de la taille minimum qui est demandé et va finir par morceler la mémoire avec de nombreuses zones non utilisées.
Aujourd'hui
A voir en vidéo sur Futura
06/09/2013, 09h28
#5
bisou10
Date d'inscription
janvier 2012
Messages
1 134
Re : Pointeurs [langage C]
Comme j'étais passé à côté de la question de l'OP !
Un "dé-référencement" se fait en assignant à ton pointeur une valeur (donc une adresse...) différente.
Un pointeur sur tableau: dans ce cas, le tableau est alloué statiquement et tu ne peux pas récupérer la place qu'il occupe. Si tu as un pointeur sur ce tableau, alors tu peux le faire pointer sur "autre chose", mais ton tableau, lui existera toujours
un tableau de pointeur: comme le souligne freepicbasic, ca dépend comment est géré la mémoire sur laquelle pointent tes éléments.
Dans tous les cas, tu peux récupérer ce que tu as alloué avec malloc() ou ses dérivés. Le reste, non.
L'étoile, en tant qu'opérateur unaire préfixé, sert également à déréférencer un pointeur, autrement dit à avoir accès au contenu « pointé » par ledit pointeur.
Voici un petit exemple :
int a = 2; // Déclaration de a, de type int, initialisé avec la valeur 2.
int *p = &a; // Déclaration de p, de type pointeur de int, initialisé avec l'adresse de a.
*p = 5; // Déréférencement de p, pour affecter 5 à la variable a, maintenant a vaut 5.
Pointeurs en COBOL
Quel charabia...
Quel est le fou furieux qui a inventé un terme pareil ?
Encore un qui n'a pas bien digéré le C et les pointeurs en particuliers.
Si l'on créé des pointeurs c'est bien aussi pour modifier le contenu de la mémoire.
Le pointeur ne sert pas qu'a lire un tableau en indexant le pointeur.
Dans le cas ou on utilise l'allocation dynamique, l'adresse n'apparait pas dans la liste des références des noms de variables créé par l'assembleur, donc cette mémoire si on change son pointeur sera tout bonnement perdu et non déréférencé puisque référencé nulle part à part dans le programme qui lui seul connait cette adresse et il faudrait faire un programme pour lister ces adresses , mais dans quel but?
Juste un terme pour embrouiller ce qui est simple...
Notez aussi que l'écriture avec * d'un pointeur s'il n'est pas utilisé pointe a priori n'importe où et si le compilo est sympa sur 0 avec le fameux message "null pointer assigment" qui vous pend au nez...
alors là !
"déréférencer" LOL, un truc qui n'existe pas ç'est vraiment du n'importe quoi !
C est pourtant l'erreur par excellence du débutant.
07/09/2013, 18h13
#7
BastienBastien
Invité
Re : Pointeurs [langage C]
Hello,
Ca me rapelle les longues journées d'été pendant lesquelles je m'amusais à créer un annuaire :
allocation dynamique de mémoire,
liste doublement chainée,
pointeur de pointeur,
pointeur de fonction,
fonction à nombre d'argument variable.
Beaucoup de "Seg Fault".
J'ai eu des migraines !
Mais au final, je l'ai eu !
Bon courage pour ton apprentissage.
Et saches qu'avec le C, il faut vraiment s'y mettre intensément pendant, genre 3 mois, pour bien integrer les notions.