web-dev-qa-db-fra.com

C++ Swapping Pointers

Je travaille sur une fonction pour échanger des pointeurs et je ne peux pas comprendre pourquoi cela ne fonctionne pas. Lorsque j'imprime r et s dans la fonction de permutation, les valeurs sont permutées, ce qui me laisse penser que je manipule une copie que je ne comprends pas car je passe par référence à p et q.

void swap(int *r, int *s)
{
    int *pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;  
    swap(&p, &q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

Impressions: p = 7q = 9

13
M K

Dans votre fonction swap, vous changez simplement la direction des pointeurs, c’est-à-dire, modifiez les objets sur lesquels le pointeur pointe (ici, c’est précisément l’adresse des objets p et q). les objets pointés par le pointeur ne sont pas du tout modifiés. 

Vous pouvez utiliser std::swap directement. Ou codez votre fonction d’échange de la manière suivante:

void swap(int *r, int *s)
{
   int temp = *r;
   *r = *s;
   *s = temp;
   return;
} 
14
taocp

La réponse acceptée par taocp n'échange pas vraiment non plus les pointeurs. Ce qui suit est la bonne façon d’échanger des pointeurs.

void swap(int **r, int **s)
{
    int *pSwap = *r;
    *r = *s;
    *s = pSwap;
}

int main()
{
    int *p = new int(7);
    int *q = new int(9);

    cout << "p = " << std::hex << p << std::endl;
    cout << "q = " << std::hex << q << std::endl << std::endl;

    swap(&p, &q);

    cout << "p = " << std::hex << p << std::endl;
    cout << "q = " << std::hex << q << std::endl << std::endl;

    cout << "p = " << *p << " q= " << *q << endl;
    return 0;
}
2
zar

La ligne r=s définit une copie du pointeur r sur la copie du pointeur s.

Au lieu de cela (si vous ne voulez pas utiliser le std: swap), vous devez le faire

void swap(int *r, int *s)
{
    int tmp = *r;
    *r = *s;
    *s = tmp;
}
1
Ed Heal

Vous avez transmis des références à vos valeurs, qui ne sont pas des pointeurs. Ainsi, le compilateur crée les (int*) temporaires et les transmet à la fonction.

Pensez à ce que sont p et q: ce sont des variables, ce qui signifie qu'elles sont des fentes allouées quelque part en mémoire (sur la pile, mais ce n'est pas important ici). Dans quel sens pouvez-vous parler de "permutation des pointeurs"? Ce n'est pas comme si vous pouviez échanger les adresses des slots.

Ce que vous pouvez faire, c'est échanger la valeur de deux conteneurs qui contiennent les adresses réelles - et ce sont des pointeurs.

Si vous voulez échanger des pointeurs, vous devez créer des variables de pointeur et les transmettre à la fonction.

Comme ça:

int p = 7;
int q = 9;

int *pptr = &p;
int *qptr = &q;
swap(pptr, qptr);
cout << "p = " << *pptr << "q= " << *qptr << endl;
return 0;
1
Euro Micelli

Vous ne passez pas par référence dans votre exemple. Cette version passe par référence,

void swap2(int &r, int &s)
{
    int pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;
    swap2(p, q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}

Passer par référence n'est pas la même chose que passer par valeur ou par pointeur. Voir les tutoriels C++ sur le Web pour une explication. Mon cerveau est trop petit pour gaspiller des cellules en stockant les détails que je peux facilement trouver sur le Web.

0
Alec Danyshchuk