- nadsky :
les trois premières fonctions font intervenir une "copie" des variables
Les arguments d'une fonction sont sans exception toujours passés par valeur et les paramètres correspondants dans la fonction sont toujours des copies des arguments
- giragu03 :
Donc si on traduit, tu copies l'adresse du tableau (
un entier)
Une adresse n'est pas un entier : c'est une adresse. Son arithmétique est différente de celle des entiers.
- giragu03 :
En effet, si tu mets un &montableau, tu obtiens l'adresse du pointeur et non l'adresse du tableau qui est la valeur du pointeur.
Deux cas :
1- Dans une déclaration de tableau non dynamique (donc sans malloc ou assimilé) de forme
type monTableau[dimension]
monTableau n'est pas une variable de type pointeur. monTableau est évalué comme une constante de type pointeur égale à l'adresse du premier élément du tableau. Son type est donc type*. On ne peut modifier monTableau.
&montableau est du type "adresse d'un tableau" soit type (*) [] (avec les parenthèses) qui est un type différent de celui de monTableau. La valeur correspond à l'adresse du premier élément du tableau mais le type est différent. Ceci ne signifie pas prendre l'adresse d'une variable pointeur
2- Dans une déclaration de tableau dynamique de forme
monTableau = malloc(dimension* sizeof type)
monTableau est ici une variable pointeur qui doit être du type type * comme précédemment. Il est modifiable (si il n'est pas spécifié const)
&monTableau est maintenant du type type ** et est bien la valeur de l'adresse du pointeur monTableau
- Remarque sur la définition d'une fonction portant un tableau en paramètre :
int minMaxTableau(int tab[],int nb,int *ptMin, int*ptMax){...}
cette écriture est correcte mais peut induire en erreur et faire croire que tab est, dans la fonction, un tableau ce qui est inexact
C'est un écriture équivalente à :
int minMaxTableau(int * tab,int nb,int *ptMin, int*ptMax){...}
qui montre bien que la variable locale tab est en fait un pointeur sur int.
Partager