En gros un pointeur c'est une adresse memoire (dans la plupart des langages qui utilisent des pointeurs). Ca pourrait etre autre chose, conceptuellement. C'est juste que pour simplifier le travail, en C, pointeur = adresse memoire.
Un pointeur est type (meme s'il a le type void, c'est type)
c'est a dire que autant que possible on ne melange pas les pointeurs de types incompatibles. (en C on peut mais c'est deconseille).
C'est a dire que tu as plusieurs types de pointeurs, un qui pointe vers une variable de type int, l'autre qui pointe vers une struct, ou encore un qui pointe vers une variable de type pointeur vers int (ahah ca se complique) etc..
En C on peut les melanger parce que les pointeurs sont des adresses memoires et donc peuvent tous etre ramenes a un type (void*) mais il faut etre conscient qu'on s'expose a des problemes si l'on manipule une banane comme on manipulerait un camion.
Tu as des operateurs definis sur les types, le premier c'est l'operateur d'adresse &. Quand tu as defini une variable, elle est TOUJOURS presente a un endroit precis en memoire. C'est pour ca que tu peux demander son adresse par l'operateur &. Une fois que tu as l'adresse de la variable tu peux mettre sa valeur dans un pointeur vers le type de la variable. Tu as une variable de type int, tu as un pointeur vers int, tu peux demander l'adresse de la premiere et la placer dans la seconde:
int toto;
int* pToto = &toto;
comme pToto est une variable, elle est presente a un endroit precis en memoire et donc tu peux egalement demander son adresse et la mettre dans une variable de type pointeur vers pointeur d'int:
int **ppToto = &pToto;
Le deuxieme operateur c'est l'operateur de deferencement *. Quand tu as une adresse memoire, tu veux savoir ce qu'il y a a cette adresse. c'est la que tu utilises l'operateur *.
Exemple, tu as recupere un pointeur int* pToto, et tu voudrais connaitre ou modifier la valeur de la variable presente a l'adresse pointee par pToto. tu fais donc:
int totobis = *pToto;
C'est donc d'une certaine facon l'operateur inverse de &.
totobis est une nouvelle variable, c'est a dire qu'elle est physiquement presente en memoire mais a une adresse differente de toto. Meme si elle en partage la valeur. (elle partage la valeur de toto, tant qu'on ne modifie pas toto ou totobis).
par contre *pToto vaudra toujours la valeur de toto, jusqu'a ce qu'on change l'adresse pointee par pToto. L'inverse est vrai: si tu modifies la valeur de *pToto, toto changera de la meme maniere.
Le pointeur permet donc d'etendre le scope d'une variable.
C'est a dire si toto est defini dans ton main, et que tu souhaites que l'une de tes fonctions puisse modifier la valeur de toto, tu es oblige (en C) de passer un pointeur vers toto a la fonction. Cette fonction qui a un parametre pToto, pourra modifier *pToto, et donc du meme coup modifier la valeur de toto.
Le pointeur permet egalement d'allouer des variables de facon dynamique et manuelle. (contrairement a l'allocation dynamique et automatique). (malloc renvoie un pointeur).
Le pointeur permet de designer un tableau d'objet. Si tu as un objet de type int a l'adresse pToto, tu as un autre objet de type int a l'adresse pToto+1. Evidemment, il faut prealablement avoir alloue (manuellement ou automatiquement) suffisamment d'espace pour pouvoir librement acceder ou ecrire a l'adresse pToto+1, sinon il y a des chances que quelque chose d'autre qu'un int se trouve en pToto+1..
Voila un rapide appercu de ce que sont les pointeurs,
il y a encore beaucoup a en dire (array et pointeur NULL en C, differents types de cast en C++, pointeur ou reference en C++, typesafety constness etc..)
LeGreg