Envoyé par
evoliptic
-en fait, je pensais qu'en passant fonction (&tableau[16]), je passais l'adresse d'un tableau de taille 16...
Bonjour
Il ne faut pas confondre "ce que l'on passe" et "ce que la fonction s'attend à recevoir". Toutefois il faut que les deux correspondent
Si tu écris
void fonction(char tab[16]);
Cela signifie qu'effectivement la fonction doit recevoir un tableau qui doit avoir au-moins une taille de 16 caractères puisque la déclaration indique que la fonction risque de taper dans les éléments de 0 à 15.
Ensuite, quand tu l'appelleras, tu devras alors lui passer un tableau.
1 2 3 4 5 6 7 8 9 10
| int main()
{
char tab[100];
fonction(tab);
fonction(&tab[0]);
fonction(&tab[10]);
fonction(tab + 10);
fonction(&tab[83]);
} |
Dans chacun de ces appels, la fonction ne reçoit qu'une adresse. Le nom qui correspond à l'adresse du premier élément, puis de nouveau l'adresse du premier élément mais écrite de façon explicite, puis l'adresse du 11°, puis l'adresse du premier à laquelle on lui ajoute de 10 ce qui revient encore à l'adresse du 11°, puis l'adresse du 84° qui autorise encore la fonction à taper dans ce 84° (qui sera pour elle tab[0]) et monter jusqu'au 100° (qui sera pour elle tab[15]).
Comme le C te garantit que les éléments d'un tableau se suivent toujours en mémoire, si t'as l'adresse d'un élément, tu peux alors sans souci passer à l'élément suivant et etc. De plus, le chiffre 16 n'est qu'un indicateur mais non une obligation. Si le tableau reçu est assez grand, rien n'interdit à la fonction à taper dans tab[20], tab[30], etc. (cela ne posera de soucis que dans le cas du dernier appel).
Etant donné que l'adresse d'un caractère c'est un char*, t'as alors le droit de remplacer ta déclaration par celle-ci: void fonction(char *tab);, le reste ne changeant pas.
Envoyé par
evoliptic
-du coup, si j'ai bien compris, dans un autre contexte, je dois passer argv[3][0] comme argument à une fonction si je veux obtenir le premier caractère de ma troisième option lors de l'exécution du programme?
Rectifions les termes erronés: argv[x] (si on parle bien de main(int argc, char *argv[])) ne contient pas une option mais un argument (un mot). Que ce mot soit une option ne dépend que des conventions passées entre programmeurs et utilisateurs (sous Unix une option commence par un tiret, ou deux tirets, sous Windows par un slashe).
Donc argv[3] contient effectivement le 3° mot passé au programme et argv[3][0] est bien le premier caractère de ce 3° mot. Mais si tu le passes à une fonction, il faut alors que la fonction soit prévue pour recevoir un caractère !!!
Partager