0
votes

Problème avec les pointeurs de passage comme argument dans la fonction définie par l'utilisateur en C ++

J'ai essayé de comprendre comment les pointeurs sont passés comme des arguments. J'ai vu dans mon livre que les pointeurs et les tableaux sont passés par défaut comme référence, mais le programme suivant m'a donné un résultat inattendu.

je m'attendais: xxx

mais la sortie est la suivante: xxx

est mon concept erroné ou y a-t-il une spéciale trompe dans ce programme. S'il vous plaît effacer le concept de pointeurs. xxx


2 commentaires

La seule fois que quelque chose est transmis par référence, c'est lorsque la fonction prend une référence.


par défaut est passé comme référence - Quel livre lisez-vous qui fait référence aux indicateurs comme "références"? En C ++, le mot "référence" a une signification spécifique, et cela ne signifie pas "pointeur" - vous devez faire très attention à cette terminologie lorsqu'il s'agit de C ++. Vous lisez probablement des livres adaptés à une autre langue informatique, où le langage informatique utilise de manière interchangeable les termes «référence» et «pointeur».


3 Réponses :


1
votes

Un pointeur est comme n'importe quel autre entier que vous passez à une fonction, sauf que l'intégrité a une signification pour le compilateur - c'est un emplacement défini en mémoire.

Les pointeurs eux-mêmes sont transmis par la valeur. Le contenu qu'ils pointent sur strud> est dit être transmis par référence. P>

Lorsque vous modifiez une variable de pointeur passée à une fonction, la valeur réelle du pointeur de la fonction d'appel reste inchangée . Cependant, lorsque vous modifiez la valeur indiquée par le pointeur, la valeur change partout. P>

dans votre exemple, X et Y sont des pointeurs; Ils contiennent les adresses de départ de "premier" et "second". "Premier" et "Deuxième" est les données pointées par X et Y respectivement. P>

Considérez les instructions dérivées de votre programme, uniquement en utilisant printf code> au lieu de Cout : P>

char X[] = "First";

// Prints "First"
printf("%s", X);

// Prints address of 'F' in memory
printf("%x", X);

// Prints address of X - the location where the value printed above is stored
printf("%x", &X);


0 commentaires

2
votes

La sortie est correcte. Votre attente est quelque peu différente du comportement réel.

Chaque fois que cela concerne les pointeurs, traitez-les toujours comme des variables contenant une adresse mémoire.

Voir étape par étape, qu'est ce qui se passe.

1) char x [] = "premier", y [] = "secondaire"; xxx

2) << "& x =" << & x << "& y =" << & y << endl;

adresses des pointeurs x Y < / code> sont émis sur l'écran.

3) alter (x, y);

sur l'exécution de cette fonction appel, pointeurs x et y sont copiés sur les paramètres de la fonction alter , disent, x 'et y' xxx

4) t = x; X = y; Y = t;

sur l'exécution de ce code, X 'et Y' Les pointeurs sont échangés. xxx

5) Cout << x << "&" << <<< y << endl;

Comme vous pouvez le voir à l'étape 4, car x "Points à l'emplacement de la mémoire contenant 'S'" est imprimé en premier et «d'abord» est imprimé ultérieurement.

6) COUT << "& x =" << & x << "& y =" << & Y << endl;

Avant l'exécution de cette instruction, les paramètres de la fonction alter sont devenus hors de portée.

Donc, maintenant, le scénario est comme ceci: xxx

7) cout << x << "*" << Y;

Comme vous pouvez le voir à l'étape 6, Parce que x pointe sur l'emplacement de la mémoire contenant 'f', "d'abord" est imprimé en premier et "seconde" est imprimé plus tard.


0 commentaires

2
votes

Oui, votre concept est complètement faux.

dans votre alter () code> fonction, que je simplifie ici (pour supprimer la sortie extrêmement non liée à votre question) P>

int main()         //  main() returns int in standard C++, not void
{
    char X[]="First", Y[]="Second";

    Alter(X,Y);
    cout<<X<<"*"<<Y;
}


0 commentaires