C'est une question très élémentaire, mais elle peut être un casse-tête pour les débutants qui ne la connaissent pas. En C++, une fonction ne peut pas retourner directement un tableau, mais un tableau est essentiellement un pointeur, donc vous pouvez faire en sorte que la fonction retourne un pointeur pour y parvenir. Par exemple, pour une fonction de multiplication matricielle, nous pouvons facilement écrire :

Exemple

#include <iostream>

using namespace std;

float* MultMatrix(float A[4], float B[4])
{
    float M[4];
    M[0] = A[0]*B[0] + A[1]*B[2];
    M[1] = A[0]*B[1] + A[1]*B[3];
    M[2] = A[2]*B[0] + A[3]*B[2];
    M[3] = A[2]*B[1] + A[3]*B[3];

    return M;
}

int main()
{
    float A[4] = { 1.75, 0.66, 0, 1.75 };
    float B[4] = {1, 1, 0, 0};
    float *M = MultMatrix(A, B);
    cout << M[0] << " " << M[1] << endl;
    cout << M[2] << " " << M[3] << endl;

    return 0;
}

Mais après l'avoir exécuté, nous constatons que le résultat est :

1.75 1.75
6.51468e-039 3.76489e-039

Ce n'est pas le résultat souhaité. Nous ajoutons donc du code d'affichage à l'intérieur de la fonction pour voir s'il s'agit d'un problème de calcul, et nous obtenons le résultat :

1.75 1.75
0 0
1.75 1.75
1.96875 1.75

Nous constatons que le résultat du calcul est correct, mais il change après avoir été retourné, et il est différent du résultat précédent. Pourquoi cela ?

Parce que le tableau M défini dans la fonction est libéré par le système après la fin de l'exécution de la fonction, donc le résultat obtenu lors de l'appel de la fonction n'est naturellement pas le résultat calculé. Une solution consiste à allouer dynamiquement de la mémoire, en utilisant new pour créer un tableau à l'intérieur de la fonction, afin qu'il ne soit pas libéré.

Nous devrions donc changer :

float M[4];

en :

float *M = new float[4];

Après la modification, son exécution donne le résultat :

1.75 1.75
0 0
1.75 1.75
0 0

Correct. Cependant, nous n'avons pas libéré l'espace que nous avons alloué nous-mêmes. Si nous le libérons à l'intérieur de la fonction, le résultat sera le même qu'au début.

Regardez notre code d'appel :

float *M = MultMatrix(A, B);

Cela fait en fait pointer le pointeur M vers la première adresse du tableau M dans la fonction. Nous pouvons libérer le pointeur M, et l'effet est le même que de libérer le tableau M alloué, car ils pointent vers le même espace mémoire. Le code est donc modifié ainsi :

Exemple

#include <iostream>

using namespace std;

float* MultMatrix(float A[4], float B[4])
{
    float *M = new float[4];
    M[0] = A[0]*B[0] + A[1]*B[2];
    M[1] = A[0]*B[1] + A[1]*B[3];
    M[2] = A[2]*B[0] + A[3]*B[2];
    M[3] = A[2]*B[1] + A[3]*B[3];
    cout << M[0] << " " << M[1] << endl;
    cout << M[2] << " " << M[3] << endl;

    return M;
}

int main()
{
    float A[4] = { 1.75, 0.66, 0, 1.75 };
    float B[4] = {1, 1, 0, 0};
    float *M = MultMatrix(A, B);
    cout << M[0] << " " << M[1] << endl;
    cout << M[2] << " " << M[3] << endl;
    effacement[] M;

    return 0;
}

Résultat de l'exécution:

1.75 1.75
0 0
1.75 1.75
0 0

Aucun problème, l'espace alloué avec new est également libéré.

Compte tenu des suggestions des experts ci-dessous, j'ai modifié le programme comme suit. Tout le monde, voyez si c'est acceptable :

Exemple

#include <iostream>

using namespace std;

void MultMatrix(float M[4], float A[4], float B[4])
{
    M[0] = A[0]*B[0] + A[1]*B[2];
    M[1] = A[0]*B[1] + A[1]*B[3];
    M[2] = A[2]*B[0] + A[3]*B[2];
    M[3] = A[2]*B[1] + A[3]*B[3];

    cout << M[0] << " " << M[1] << endl;
    cout << M[2] << " " << M[3] << endl;
}

int main()
{
    float A[4] = { 1.75, 0.66, 0, 1.75 };
    float B[4] = {1, 1, 0, 0};

    float *M = new float[4];
    MultMatrix(M, A, B);

    cout << M[0] << " " << M[1] << endl;
    cout << M[2] << " " << M[3] << endl;
    effacement[] M;

    return 0;
}

Commentaires de révision :

Premièrement, le delete pour un tableau doit être delete[].

Deuxièmement, un principe important de l'allocation manuelle de mémoire en C++ est que celui qui alloue la mémoire doit la libérer.

Par conséquent, vous ne devez pas utiliser new pour créer un tableau à l'intérieur de MultMatrix ; à la place, vous devez l'allouer à l'extérieur et le passer en paramètre pour qu'il soit modifié.

Pour renvoyer un tableau, utiliser quelque chose comme des pointeurs intelligents est la bonne façon.

Adresse d'origine : https://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html