dans ma compréhension paramètre 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>.
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);
}
3 Réponses :
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. P>
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. P>
HOO (tableau, 5); code> essaie de convertir
Array code> à un
int * code> Mais le résultat de cette conversion est une r devalue et ne peut pas être lié à une référence non code> const code>. Si, par exemple, vous avez changé
hoo code> pour prendre une référence
const code>, il compilera bien: p>
xxx pré> dans ce cas , vous ne pouvez pas changer quel em>
p code> pointe, en faisant l'utilisation d'une référence inutile. P> blockQquote>
Lorsqu'une fonction prend un paramètre 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 * & code>, c'est-à-dire une référence (non-déplacement) à un pointeur à an-
int code> - 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:
int [5] code>. Il n'y a pas en réalité une variable
int * code> n'importe où - il n'y a que 5
int code> s. Lorsque vous passez
array code> sur
hoo () code>, ce que C ++ fait avec cet identifiant est un DÉCONNEUR DE TRAY-TO-POINTER : Cela passe en fait
& (tableau [0]) code>. Donc, comme dans le cas précédent, cela ne compilera pas. P> p>
Les autres réponses expliquent déjà le problème. Je veux suggérer un changement de pratique de codage.
Utilisation de L'appel à la fonction devient naturel . p> 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, 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>
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);
}
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.
"paramètre
int * & p code> in
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>. " i> Et si vous essayez de faire
p = nullptr code> dans
hoo code>? Quel serait le résultat prévu pour
tableau code>?
Un tableau est pas b> un pointeur à son premier élément. Votre titre pose une question totalement différente de votre texte. Vous peut i> Passer un
int [] code> à un
int * code>, mais pas à un
int * & code>.
@tkausl J'ai édité le titre de la question et il invalide une partie de votre commentaire.
Un tableau est pas B> 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 code> à 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 code> ou
std :: vecteur code>
@ user463035818: Apprendre C ++ et OpenCV.