18

我正在研究一个交换指针的函数,但我不知道为什么这不起作用。当我在交换函数中打印出 r 和 s 时,值被交换,这让我相信我正在操作一个我不理解的副本,因为我通过引用 p 和 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;
}

打印:p = 7q = 9

4

6 回答 6

24

在你的swap函数内部,你只是改变指针的方向,即改变指针指向的对象(这里,特别是对象的地址pq)。指针指向的对象根本没有改变。

你可以std::swap直接使用。或者像下面这样编写你的交换函数:

void swap(int *r, int *s)
{
   int temp = *r;
   *r = *s;
   *s = temp;
   return;
} 
于 2013-03-28T01:54:57.930 回答
10

taocp 接受的答案也没有完全交换指针。以下是交换指针的正确方法。

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;
}

我机器上的输出:

p = 0x2bf6440
q = 0x2bf6460

p = 0x2bf6460
q = 0x2bf6440

p = 9 q= 7
于 2018-07-18T17:59:01.080 回答
1

该行r=s正在将指针的副本设置为指针r的副本s

相反(如果你不想使用 std:swap)你需要这样做

void swap(int *r, int *s)
{
    int tmp = *r;
    *r = *s;
    *s = tmp;
}
于 2013-03-28T01:57:42.143 回答
1

您传递了对您的值的引用,这些引用不是指针。因此,编译器会创建临时(int*)的 's 并将它们传递给函数。

想想什么pq是:它们是变量,这意味着它们是分配在内存中某处的插槽(在堆栈上,但这在这里并不重要)。您可以在什么意义上谈论“交换指针”?这不像您可以交换插槽的地址。

您可以做的是交换保存实际地址的两个容器的值 - 这些是指针。

如果你想交换指针,你必须创建指针变量,并将它们传递给函数。

像这样:

int p = 7;
int q = 9;

int *pptr = &p;
int *qptr = &q;
swap(pptr, qptr);
cout << "p = " << *pptr << "q= " << *qptr << endl;
return 0;
于 2013-03-28T02:07:34.730 回答
0

在您的示例中,您没有通过引用传递。这个版本通过引用,

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;
}

通过引用传递与通过值或指针传递不同。有关说明,请参阅 Web 上的 C++ 教程。我的大脑太小了,不能浪费细胞来存储我可以在网上轻松找到的细节。

于 2013-03-28T02:19:54.103 回答
0

问题是范围的变化。下一个函数适用于任何类型的指针。

void swapPointers(void* ptrA, void* ptrB){
    void* swapPtr = *(void**)ptrA;
    *(void**)ptrA = *(void**)ptrB;
    *(void**)ptrB = swapPtr;
}

int main(){
    int a = 5;
    int b = 6;
    int* ptra = &a;
    int*ptrb = &b;
    swapPointers(&ptra, &ptrb);
}
于 2021-03-29T09:39:07.857 回答