C ++交换指针

时间:2013-03-28 01:45:14

标签: c++ pointers

我正在研究交换指针的函数,我无法弄清楚为什么这不起作用。当我在交换函数中打印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

6 个答案:

答案 0 :(得分:14)

在你的swap函数中,你只是改变指针的方向,即改变指针指向的对象(这里,具体地说它是对象的地址p和{{1 }})。指针指向的对象根本不会改变。

您可以直接使用q。或者像以下代码编写交换函数:

std::swap

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

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

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

像这样:

int p = 7;
int q = 9;

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

答案 4 :(得分: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 ++教程。我的大脑太小,不能浪费细胞存储我在网上可以找到的细节。

答案 5 :(得分:0)

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

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