SOS tableau en c++

Fermé
asma sisi Messages postés 96 Date d'inscription vendredi 29 août 2008 Statut Membre Dernière intervention 23 mars 2011 - 23 nov. 2008 à 20:07
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 nov. 2008 à 21:48
Bonjour,
je suis étudiante en deuxième année licence informatique (LMD) et on étudie on fait notre programmation avec le c++; ma question est
Lors du passage d'un tableau comme paramètre a une fonction on a deux façon l'une que je la maitrise est introduite sous cet exemple:
méthode 1:
#include<iostream>
void fct (int*t,......)
{
/* le t est un pointeur vers un entier qui est le premier élément du tableauet pour manipuler les autres cases du tableau en met *(t+i) tel que i est l'indice de la case voulu*/
.........
}
int main()
{
int tab[30];
....
........
/*l'appelle de la fct avec notre tableau déclaré dans le main*/

fct (tab,.....);
/*alors on va copier l'adresse du premier élément du tableau tab dans l'argument t de fct qui est (t un pointeur de ) */
}
méthode 2:
cet méthode consiste a mettre ca:

#include<iostream>
void fct (int t[],......)
{
.........
}
int main()
{
int tab[30];
........
/*l'appelle de la fct avec notre tableau déclaré dans le main*/

fct (tab,.....);
}
ma question est :
dans la deuxième méthode on va copier l'adresse du premier élément du tableau dans l'argument de la fonction fct qui doit être un pointeur mais dans l'argument de fct en a mis int tab[] et moi je pense que le type doit être int*
Si vous pouvez m'expliquer ou peut être me corriger dans le plus tôt possible
je m'excuse de la longueur du message et peut être des fautes
cordialement sisi
}

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 nov. 2008 à 21:18
Salut,
En fait, en C ou en C++, on ne passe jamais un tableau (trop gourmand en mémoire), mais on passe un pointeur sur le premier argument. Donc que le prototype de ta fonction soit void fct(int a[5]); ou void fct(int a[]), ça sera interprété comme un void fct(int *a). On passe seulement l'adresse.
Donc, aucun souci ;)
Cdlt
0
asma sisi Messages postés 96 Date d'inscription vendredi 29 août 2008 Statut Membre Dernière intervention 23 mars 2011 20
23 nov. 2008 à 21:40
merci beaucoup pour votre réponse et si j'ai bien compris la notation int t[] et la même que int*t
si c'est vrai signaler moi
merci encore FIDDY
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > asma sisi Messages postés 96 Date d'inscription vendredi 29 août 2008 Statut Membre Dernière intervention 23 mars 2011
23 nov. 2008 à 21:48
Dans le cas d'un prototype de fonction oui. Je m'explique.
int *tab=malloc(10*sizeof(int));
int tab2[10];

Les deux tableaux n'ont rien à voir. L'un est un pointeur sur une zone. Et l'autre est un vrai tableau. On peut les confondre assez facilement, car pour avoir accès à une case, c'est la même notation dans les deux cas, à savoir : *(tab+i) ou tab[i]. Pareil pour tab2.
D'ailleurs : pour te convaincre que c'est pas pareil pour autant : la taille de tab2 fait 10*taille(int) = 40 (dépend de l'architecture de ta machine).
Et la taille de tab fait la taille d'un pointeur, donc 4.
Voilà pourquoi le C, (surtout à ses débuts) ne passe pas une copie du tableau en argument à une fonction, mais envoie dans les deux cas, un pointeur sur le premier argument.
Donc si tu as une fonction :
void fct(int *tab) ou void fct(int tab[]) ou void fct(int tab[n'importe quelle nombre])

Cela sera équivalent. Ce sera dans tous les cas, le pointeur qui sera passé.
Cdlt
0