/* Introduction aux pointeurs */ #include main() { int i,j; int *pi,*pj; /* "*" n'est pas l'operateur d'indirection */ int tab[3]; int *tabp[10]; char *ps; char buffer[80]; char **pp; /*********************** Manipulations de base ****************************/ i=12; pi = &i; pj = pi; j = (*pj) +1; /* "*" est l'operateur d'indirection */ printf("Valeur de *pj %d \n",*pj); printf("Valeur de *pj via pj[0] %d \n",pj[0]); printf("Valeur de j : %d\n",j); printf("Ou encore, via *&j : %d\n\n",*&j); pj=&j; pj=pi; printf("Valeur de j %d,\n",j); printf("Valeur de *pj %d,\n",*pj); printf("Adresse %d,\n\n",pj); /********************* Pointeurs et tableaux ******************************/ /* Bases de l'arithmetique des pointeurs */ tab[0]=1; tab[1]=2; tab[2]=3; pi = tab ; printf("Valeur de *pi %d\n",*pi); /* NOM DE TABLEAU = POINTEUR */ pi = &tab[0] +2 ; /* pointe vers le 0+2 ieme element du tableau */ pi = tab +2 ; /* formulation equivalente */ /* Remarquer que tab est une adresse constate tandis que pi est un pointeur variable */ printf("Valeur de *pi %d\n",*pi); printf("Valeur de l'element precedent du tableau tab : %d,\n",*(pi-1)); pi--; printf("Utilisant pi-- au lieu de pi-1 : %d,\n",*(pi)); printf("Remarque pi[1]: %d\n",pi[1]); /* pi[1] donne donc le CONTENU de l'element suivant celui dont l'adresse est donnee par pi (pointeur dereference) */ pi[-1] = 10; /* permet de modifier tab[0] puisque pi pointe vers tab[1] */ printf("Nouvelle valeur de tab[0] %d\n\n",tab[0]); /* Tableaux de pointeurs, attention au (non) dereferencement */ i=10; tabp[0]=&i; printf("Valeur de *(tabp[0]) %d\n", *(tabp[0]) ); printf("Valeur de tabp[0] %d NON DEREFERENCE\n", tabp[0] ); printf("Valeur de (tabp[0])[0] %d\n", (tabp[0])[0] ); /****************** Allocation DYNAMIQUE de memoire **************************/ printf("Combien d'entiers souhaitez-vous ranger dans tableau ?\n"); scanf("%d",&i); pi = (int *) malloc(i*sizeof(int)); /* On def un pointeur pour acceder */ /* a un bloc memoire */ if (pi==NULL) { printf("Allocation demandee impossible\n"); exit(1); } for(j=0;j<=i;j++) { pi[j]=j; } printf("%d ",pi[i-1]); /* On peut manipuler le pointeur */ printf("%d ",*(pi+i/2)); /* comme un tableau */ printf("%d ",pi[i+1]); /***************** Reallocation de memoire **********************************/ pi = (int *) realloc(pi,2*i*sizeof(int)); printf("\n%d ",pi[i]); printf("%d ",pi[i+1]); printf("\nDifference pi-pj : %d,\n",pi-pj); printf("Attention, la difference entre 2 pointeurs n'est pas un pointeur\n\n"); /***************** Pointeurs et chaines de caracteres *********************/ /* Manipulation des chaines simplifiee par emploi pointeurs */ /* car le nom d'une chaine de caracteres est un pointeur */ ps="Bye Bye"; printf("%s (chaine de caracteres vers laquelle pointe ps)\n",ps); /* ps pointe vers 1er element de chaine */ printf(" ps[1] %c\n",ps[1]); /* acces au 2ieme element de chaine */ /* noter l'absence de l'* (indirection) */ printf(" *(ps+1) %c\n",*(ps+1)); /* formulation equivalente */ printf("Rentrer une chaine de caracteres\n"); while(getchar()!='\n') ; scanf("%s",buffer); ps=buffer; printf("Vous avez rentre %s\n",ps); /* Ne pas ecrire directement scanf("%s",ps); source de problemes */ /* Ci dessous : important d'utiliser calloc ou malloc */ /* ps="Bye Bye"; apres le malloc fait que ps ne semble plus etre une Lvalue */ ps= (char *) calloc(100,sizeof(char)); printf("Rentrer une chaine de caracteres\n"); scanf("%s",ps); printf("Pour finir, vous avez rentre %s\n",ps); pp = (char **) malloc(3*sizeof(char *)); pp[0]="Bonjour"; pp[1]="Salut"; pp[2]="Bongiorno"; for (i=0;i<=2;i++,pp++) { printf("%s ",pp[0]); } /* On pourrait bien sur n'incrementer que i, pas pp, et afficher pp[i] */ }