88 votes

Passer des tableaux à une fonction en C++

#include <iostream>
using namespace std;

void printarray (int arg[], int length) {
    for (int n = 0; n < length; n++) {
        cout << arg[n] << " ";
        cout << "\n";
    }
}

int main ()
{
     int firstarray[] = {5, 10, 15};
     int secondarray[] = {2, 4, 6, 8, 10};
     printarray(firstarray, 3);
     printarray(secondarray, 5);

     return 0;
}

Ce code fonctionne, mais je veux comprendre comment le tableau est transmis.

Lorsqu'un appel est passé au printarray de la fonction principale, le nom du tableau est transmis. Le nom du tableau fait référence à l'adresse du premier élément du tableau. En quoi cela équivaut-il à int arg[] ?

65voto

Seth Carnegie Points 45196

Les syntaxes

int[]

y

int[X] // Where X is a compile-time positive integer

sont exactement les mêmes que

int*

dans la liste des paramètres d'une fonction (j'ai omis les noms optionnels).

En outre, un nom de tableau se décompose en un pointeur sur le premier élément lorsqu'il est transmis à une fonction (et non par référence). int firstarray[3] y int secondarray[5] la décrépitude à int* s.

Il arrive également qu'une déréférence de tableau et une déréférence de pointeur avec la syntaxe de l'indice (la syntaxe de l'indice est x[y] ) produisent une valeur l pour le même élément lorsque vous utilisez le même index.

Ces trois règles se combinent pour que le code soit légal et fonctionne comme prévu ; il transmet simplement des pointeurs à la fonction, ainsi que la longueur des tableaux, que vous ne pouvez pas connaître une fois que les tableaux se transforment en pointeurs.

23voto

DGomez Points 1400

Je veux juste ajouter ceci, lorsque vous accédez à la position du tableau comme

arg[n]

est identique à

*(arg + n) signifie un décalage de n à partir de l'adresse de l'arg.

donc arg[0] sera *arg

11voto

Olaf Dietsche Points 35264

firstarray y secondarray sont convertis en un pointeur sur int, lorsqu'ils sont passés à printarray() .

printarray(int arg[], ...) est équivalent à printarray(int *arg, ...)

Cependant, cela n'est pas spécifique au C++. Le C a les mêmes règles pour passer des noms de tableaux à une fonction.

0voto

Bob Warner Points 145

La réponse est simple : les tableaux sont TOUJOURS passés par référence et l'expression int arg[] indique simplement au compilateur qu'il s'attend à un tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X