Ceci :
int fillarr(int arr[])
est en fait traité de la même manière que :
int fillarr(int *arr)
Maintenant, si vous voulez vraiment retourner un tableau, vous pouvez changer cette ligne en
int * fillarr(int arr[]){
// do something to arr
return arr;
}
Il ne s'agit pas vraiment d'un tableau, mais d'un pointeur sur le début du tableau. l'adresse du tableau.
Mais n'oubliez pas que lorsque vous passez le tableau, vous ne passez qu'un pointeur. Ainsi, lorsque vous modifiez les données du tableau, vous modifiez en fait les données que le pointeur pointe. Par conséquent, avant de passer le tableau, vous devez réaliser que vous avez déjà à l'extérieur le résultat modifié.
par exemple
int fillarr(int arr[]){
array[0] = 10;
array[1] = 5;
}
int main(int argc, char* argv[]){
int arr[] = { 1,2,3,4,5 };
// arr[0] == 1
// arr[1] == 2 etc
int result = fillarr(arr);
// arr[0] == 10
// arr[1] == 5
return 0;
}
Je suggère que vous envisagiez d'introduire une longueur dans votre fonction fillarr, comme par exemple comme ceci.
int * fillarr(int arr[], int length)
De cette façon, vous pouvez utiliser length pour remplir le tableau à sa longueur, quelle qu'elle soit.
Pour l'utiliser correctement. Faites quelque chose comme ceci :
int * fillarr(int arr[], int length){
for (int i = 0; i < length; ++i){
// arr[i] = ? // do what you want to do here
}
return arr;
}
// then where you want to use it.
int arr[5];
int *arr2;
arr2 = fillarr(arr, 5);
// at this point, arr & arr2 are basically the same, just slightly
// different types. You can cast arr to a (char*) and it'll be the same.
Si tout ce que vous voulez faire, c'est donner au tableau des valeurs par défaut, envisagez d'utiliser la fonction memset intégrée.
s memset((int*)&arr, 5, sizeof(int)) ;
Pendant que je parle de ce sujet. Vous dites que vous utilisez C++. Jetez un coup d'œil à l'utilisation des vecteurs stl. Votre code sera probablement plus robuste.
Il existe de nombreux tutoriels. En voici un qui vous donne une idée de la manière de les utiliser. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html
58 votes
Dans ce contexte, il n'est pas nécessaire de renvoyer le tableau puisque celui-ci est transmis par référence et que tout changement apporté aux éléments contenus dans "arr" sera perçu en dehors de la fonction.
13 votes
Le retour du tableau est pratique pour enchaîner les fonctions.
6 votes
Tant que vous ne faites pas l'erreur de créer un tableau sur la pile et de renvoyer un pointeur vers ce tableau.
1 votes
@buggerme oui vous avez raison , mais vous pouvez considérer le tableau retourné arr2 , totalement un autre tableau , mon erreur désolé :)
2 votes
@ismail : Il ne peut pas retourner un nouveau tableau, à moins que ce tableau n'ait été alloué dynamiquement. Et si c'est le cas, utilisez
std::vector
.5 votes
@BuggerMe : Les tableaux sont no passé par référence (à moins que vous ne le demandiez avec une syntaxe beaucoup plus amusante), dans le code, le tableau décadences en un pointeur sur le premier élément, qui est transmis à la fonction. La fonction
5
dans la signature de la fonction est ignorée par le compilateur.0 votes
Dans l'essence du langage C, lorsque vous transmettez des tableaux, vous les transmettez toujours par référence, ce qui permet de modifier le contenu du tableau. Ce que je pense que vous voulez dire, c'est que vous passez le ptr du tableau par référence, ce qui permet de changer le ptr.
4 votes
@BuggerMe : Non, pas vraiment. J'ai été précis car je me suis habitué à ce que les gens ne comprennent pas la sémantique de l'article. pass-by-value pour les tableaux en C++. Le passage d'un tableau par référence est :
void foo( int (&array)[5] );
(tableau de 5 ints par référence). Lorsque vous passez par référence, ce que vous obtenez à l'intérieur de la fonction est un référence au type réel. D'autre part, lesvoid foo( int array[5] )
est traduit par le compilateur envoid foo(int*)
lors de la définition de la fonction. Appelfoo( myarray )
produit le pourrissement du tableau à un pointeur sur le premier élément.0 votes
@David désolé mais un tableau c n'est jamais transmis par la valeur, la seule façon de le faire (en C) est de le mettre dans une structure. Je suis d'accord que le pointeur vers le tableau est par valeur mais le tableau lui-même est passé par valeur.
2 votes
@BuggerMe : Je n'ai peut-être pas été assez clair. savoir qu'en C/C++, les tableaux ne sont jamais transmis par valeur. Si vous lisez attentivement le commentaire, vous verrez que "la sémantique de l'élément pass-by-value syntaxe". C'est-à-dire que la syntaxe est celle de pass-by-value mais la sémantique n'est pas celle de pass-by-value , la langue transforme cette syntaxe dans l'espace connu tableau décomposé . Cette discussion sur le c++ s'étend bien au-delà de l'utilisation prévue des commentaires. Google pour Décroissance de la référence d'un tableau c++ . L'un des premiers résultats est este .