Académique Documents
Professionnel Documents
Culture Documents
• Pointeur?
• L'opérateur d'adresse &
• Déclaration et manipulation de
pointeur
• Passage des arguments de fonctions
par adresse
• Tableaux transmis en argument
Pr DEHBI Rachid
pointeurs?
• C'est toute la puissance du langage C.
• Ils sont ni plus ni moins que des variables
contenant l'adresse d'autres variables.
Pr DEHBI Rachid
L'opérateur d'adresse &
• Il permet de connaître l'adresse de n'importe
quelle variable ou constante.
#include <stdio.h>
/* Déclaration d'un entier */
int i;
void main()
{
i=3;
/* Affichage de la valeur et de l'adresse de i */
printf("La valeur de i est %d\n",i);
printf("L'adresse de i est %d\n",&i);
}
Déclaration et manipulation de
pointeur
• Un pointeur est une variable contenant l'adresse
d'une autre variable (Indirection)
• La déclaration de pointeur se fait en rajoutant une
étoile * devant L'identificateur de pointeur.
• Syntaxe:
<classe><type>*ptr_identificateur_de_pointeur;
NB: Il est conseillé, mais pas obligatoire, de faire
commencer chaque identificateur de pointeur par
ptr_ pour les distinguer des autres variables.
Exemple
#include <stdio.h>
/* Déclaration d'un entier */
int i;
/* Déclaration d'un pointeur d'entier */
int *ptr_i;
void main()
{
/* Initialisation de ptr_i sur l'adresse de i */
printf(" l adresse %d \n",&i);
ptr_i=&i;
printf(" l adresse %d \n",ptr_i);
}
La valeur d'un pointeur
• Pour pouvoir accéder à la valeur d'un
pointeur il suffit de rajouter une étoile * devant
l'identificateur de pointeur.
Remarque: Si vous tapez l'exemple précédant le pointeur ptr_i ne sera sûrement pas égal à
100, car c'est le système d'exploitation de la machine qui fixe l'adresse de la variable i.
Passage des arguments de fonctions
par adresse
• La transmission par référence n’existe pas en
langage C; elle est émulée par le passage par
adresse.
• Principe : On communique l’adresse d’une
variable, ce qui permet d’en modifier le contenu
(sans modifier l’adresse elle-même).
• L’adresse d’une variable est manipulée par un
pointeur.
• Les paramètres formels doivent être des
pointeurs ; les paramètres effectifs doivent
être des adresses, par exemple des noms de
variables précédés de l’operateur d’adressage &.
Exemple- Rappelons que le programme
suivant :
/* valeur_2.c */ /* adresse.c */
#include <stdio.h> #include <stdio.h>
void affiche(int n) void affiche(int *n)
{ { Son exécution fait
n = 4; *n = 4;
afficher 4 puis 4.
printf("%d \n", n); printf("%d \n", *n);
La fonction
} }
affiche() a donc
void main(void) void main(void) changé la valeur
{ {
de n dans la
int n = 3; int n = 3;
fonction
affiche(n); affiche(&n);
principale.
printf("%d \n", n); printf("%d \n", n);
} }
#include <stdio.h>
int t1[10];
void fct (int t[10]){
int i;
for (i=0 ; i<10 ; i++) t[i] = i ;
}
void main()
{
fct(t1);
int i;
for (i=0 ; i<10 ; i++) {
printf("La valeur de tab est %d\n",t1[i]);
}
}
Second exemple : tableau de taille
variable
main()
{ int t1[30], t2[15], t3[10] ;
int s1, s2, s3 ;
.....
s1 = som(t1, 30) ;
s2 = som(t2, 15) + som(t3, 10) ;
.....
}
• l’en-tête peut préciser la dimension d’un tableau
int som (int nb, int t[nb])
• L’en-tête suivant serait rejeté :
int som (int t[nb], int nb)
Exemple
#include <stdio.h>
void somme(int n,int a[n] );
#include <stdio.h> void main(void){
void somme(int x[], int n); int i;
void main(void){ int p[6] = { 1, 2,3, 5, 7, 11 };
int i; for (i=0;i<6;i++)
int p[6] = { 1, 2,3, 5, 7, 11 }; printf("%d ", p[i]);
somme(p, 6); printf("\n",
for (i=0;i<6;i++) p[i]);
printf("%d ", p[i]); somme(6, p);
} for (i=0;i<6;i++)
printf("%d ", p[i]);
void somme(int x[], int n){ }
int i;
for(i = n-1; i >0 ; i--) void somme(int n,int a[n] ){
a[i] += a[i-1]; int i;
} for(i = n-1; i >0 ; i--)
a[i] += a[i-1];
}
Exemple de passage par adresse de tableau:
Fonction calculant la longueur d’une chaîne de
caractères
#include <stdio.h> while(*ptr_chaine!='\0')
/* Déclaration et initialisation d'une {
chaîne de caractères */ nb_car++; /* Incrémente le compteur de
char message[10]="Renéaa"; caractères */
/* Déclaration de prototype */ ptr_chaine++; /* Incrémente le pointeur
int long_ch(char *ptr_chaine); de chaîne */
int long_ch(char *ptr_chaine) }
/* Description: Donne le nombre de return(nb_car); /* Renvoie le nb de
caractères d'une chaîne */ caractères */
/* ptr_chaine : Pointeur de type char, }
pointant sur la chaîne */ void main()
/* renvoie le nombre de caractères dans un {
entier */ printf("La longueur de %s est
{ %d\n",message,long_ch(message));
/* Variable locale compteur */ }
int nb_car;
/* Initialisation du compteur */
nb_car=0;
/* Faire tant que le caractère est différent
de '\0' */