Bonjour,
Je tente de rédiger un petit fascicule de TP sur le langage C pour débutant.
Je suis tombé sur un point que je n'arrive pas à expliquer.
Supposant que l'on désire écrire une procédure qui incrémente la valeur du paramètre en entrée.
Tout le monde serait d'accord à dire que le mode de passage du paramètre doit être par adresse (pointeur)
cela afin de modifier réellement le contenu de la variable du programme appelant et non sa copie. Ce qui donne :
Nous avons donc passé l'adresse de x en paramètre à la fonction incremente_val, et celle-ci incrémente le contenu de l'adresse pointée par le paramètre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void incremente_val( int *v ) { *v=*v+1; } int main(void) { int x ; x=3; incremente_val(&x); //x vaut maintenant 4 return 0; }
Jusqu'ici tout se passe bien.
Maintenant, supposons que l'on désire créer une procédure qui n'incrémente pas une valeur mais toutes les valeurs d'un tableau de 5 éléments.
Je pensais que l'on devait procéder de la même manière à la seule différence que la procédure devra prendre l'adresse du tableau et non pas d'une variable scalaire.
Cependant, j'ai constaté que si je ne précise pas que le mode de passage du paramètre tableau est par adresse, cela fonctionne quand même !
dans le code ci-dessous, le tableau a bien été modifié au niveau du main sans qu'il soit passé par adresse dans la procédure ?!
Dois-je en déduire que lorsqu'un paramètre de type tableau est passé en paramètre à une procédure, cette dernière considère explicitement le paramètre comme étant l'adresse du tableau?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #define X 4 void incremente_tab( int tab[X] ) { int i,j; for(i=0; i<X; i++) { tab[i]++; } } int main(void) { int tab1[X]; int i; for(i=0; i<X; i++) { tab1[i] = 1; } incremente_tab(tab1); //je constate ici que la tableau tab1 a bien été modifié alors que le passage ne s'est pas fait par adresse return 0; }
Partager