我正在研究交换指针的函数,我无法弄清楚为什么这不起作用。当我在交换函数中打印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
答案 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*)
并将它们传递给函数。
考虑p
和q
是什么:它们是变量,这意味着它们是在内存中某处分配的插槽(在堆栈中,但这在这里并不重要)。在什么意义上你能谈到“交换指针”?这不像你可以交换插槽的地址。
你可以做的是交换两个容纳实际地址的容器的值 - 这些是指针。
如果要交换指针,则必须创建指针变量,并将它们传递给函数。
像这样:
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);
}