-2
votes

Pourquoi ne pouvons-nous pas passer le tableau Int [] à HOO (int * & P)?

dans ma compréhension array code> dans int gray [] = {1,2,3,4,5} code> est juste un pointeur sur le premier élément de Array code>. Cela signifie que (code> peut être attribué à un pointeur PTR code> de type int * code>.

paramètre int * & p code > Dans HOO code> passera l'argument par référence. Cela signifie que nous pouvons modifier l'argument transmis pour pointer vers une autre valeur de l'intérieur du HOO code>. P>

void hoo(int* &p, int n)
{
    for (int i = 0; i < n; i++)
        cout << p[i] << endl;
}

int main()
{
    int array[] = { 1,2,3,4,5 };

    // I can do this
    int* ptr = array;
    hoo(ptr, 5);

    // but not this.
    //hoo(array, 5);
}


6 commentaires

"paramètre int * & p in hoo passera l'argument par référence. Cela signifie que nous pouvons modifier l'argument transmis pour pointer vers une autre valeur de l'intérieur du hoo . " Et si vous essayez de faire p = nullptr dans hoo ? Quel serait le résultat prévu pour tableau ?


Un tableau est pas un pointeur à son premier élément. Votre titre pose une question totalement différente de votre texte. Vous peut Passer un int [] à un int * , mais pas à un int * & .


@tkausl J'ai édité le titre de la question et il invalide une partie de votre commentaire.


Un tableau est pas un pointeur, arrêt complet. Cela vous fera économiser de nombreux maux de tête si vous traitez un tableau comme ce qu'il est vraiment. Oui, cela peut se dégrader à un pointeur dans la plupart des cas, mais ne le pense pas comme un pointeur. De plus, vous pouvez simplement arrêter d'utiliser des tableaux bruts et utiliser std: tableau à leur place. Ils vont faire des problèmes comme ça va partir.


Y a-t-il un réel problème que vous essayez de résoudre ou est-ce juste pour un but d'apprentissage? Dans les deux cas, utilisez un std :: tableau ou std :: vecteur


@ user463035818: Apprendre C ++ et OpenCV.


3 Réponses :


7
votes

dans mon tableau de compréhension dans le tableau Int [] = {1,2,3,4,5} est juste un pointeur sur le premier élément de la matrice.

Ce n'est pas correct. Les tableaux sont des tableaux et des pointeurs sont des pointeurs. Ce sont des types distincts avec des propriétés distinctes. Ils sont souvent confus car une matrice a la propriété qu'il se décomposera avec impatiemment d'un pointeur à son premier élément.

HOO (tableau, 5); essaie de convertir Array à un int * Mais le résultat de cette conversion est une r devalue et ne peut pas être lié à une référence non const . Si, par exemple, vous avez changé hoo pour prendre une référence const , il compilera bien: xxx

dans ce cas , vous ne pouvez pas changer quel p pointe, en faisant l'utilisation d'une référence inutile.


0 commentaires

3
votes

Lorsqu'une fonction prend un paramètre int * & , c'est-à-dire une référence (non-déplacement) à un pointeur à an- int - alors il a besoin être une variable de pointeur de bonne foi à laquelle cette référence se réfère. Il ne peut pas être une valeur temporaire du pointeur. Ainsi, vous ne pouvez pas faire: xxx

car il n'y a pas de variable de pointeur pour se référer - juste le temporaire. C'est essentiellement la même chose avec votre int [5] . Il n'y a pas en réalité une variable int * n'importe où - il n'y a que 5 int s. Lorsque vous passez array sur hoo () , ce que C ++ fait avec cet identifiant est un DÉCONNEUR DE TRAY-TO-POINTER : Cela passe en fait & (tableau [0]) . Donc, comme dans le cas précédent, cela ne compilera pas.


0 commentaires

3
votes

Les autres réponses expliquent déjà le problème. Je veux suggérer un changement de pratique de codage.

Utilisation de void hoo (int * & p, int n) code> comme la déclaration de fonction est très très ancienne style. Utilisation de modèles, vous pouvez laisser le compilateur en déduire la taille et obtenir une référence à la matrice, ce qui évite la nécessité d'utiliser un pointeur. P> xxx pré>

L'appel à la fonction devient naturel . p> xxx pré>

Si votre fonction doit être capable de prendre en charge des tableaux alloués dynamiquement, vous pouvez surcharger la fonction comme suit. P>

void hoo(int* p, size_t N)
{
    for (int i = 0; i < N; i++)
        cout << p[i] << endl;
}

template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
    hoo(p, N);
}


2 commentaires

Cela n'acceptera pas une matrice allouée dynamiquement si à peu près, il a une utilisation très limitée.


@Slava, vrai. Mise à jour de la réponse.