C++ C++;交换指针
我正在研究一个交换指针的函数,我不明白为什么这个函数不起作用。当我在swap函数中打印出r和s时,值被交换了,这使我相信我正在处理一个我不理解的副本,因为我通过p和q的引用传递C++ C++;交换指针,c++,pointers,C++,Pointers,我正在研究一个交换指针的函数,我不明白为什么这个函数不起作用。当我在swap函数中打印出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);
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;
}
void交换(int*r,int*s)
{
int*pSwap=r;
r=s;
s=pSwap;
返回;
}
int main()
{
int p=7;
int q=9;
互换(p&p&q);
cout在您的swap
函数中,您只是更改指针的方向,即更改指针指向的对象(这里,特别是对象的地址p
和q
)。指针指向的对象一点也没有更改
您可以直接使用std::swap
。或者按照以下方式对swap函数进行编码:
void swap(int *r, int *s)
{
int temp = *r;
*r = *s;
*s = temp;
return;
}
行r=s
将指针r
的副本设置为指针s
的副本
相反(如果您不想使用std:swap),您需要这样做
void swap(int *r, int *s)
{
int tmp = *r;
*r = *s;
*s = tmp;
}
您传递了对值的引用,这些值不是指针。因此,编译器创建了临时的(int*)
,并将它们传递给函数
想想p
和q
是什么:它们是变量,这意味着它们是内存中某个位置分配的插槽(在堆栈上,但这在这里并不重要)。从什么意义上说,你可以谈论“交换指针”?这不像你可以交换插槽的地址
您可以做的是交换两个包含实际地址的容器的值,这两个容器都是指针
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;
}
如果要交换指针,必须创建指针变量,并将其传递给函数
像这样:
int p = 7;
int q = 9;
int *pptr = &p;
int *qptr = &q;
swap(pptr, qptr);
cout << "p = " << *pptr << "q= " << *qptr << endl;
return 0;
intp=7;
int q=9;
int*pptr=&p;
int*qptr=&q;
掉期(pptr、qptr);
cout在您的示例中,您不是通过引用传递。此版本通过引用传递
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;
}
void swap2(内部和外部、内部和外部)
{
int-pSwap=r;
r=s;
s=pSwap;
返回;
}
int main()
{
int p=7;
int q=9;
swap2(p,q);
couttaocp接受的答案也不是完全交换指针。下面是交换指针的正确方法
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;
}
问题是范围的改变。
下一个函数适用于任何类型的指针
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);
}
你在操作指针的副本,而不是指针指向的数据。只需std::swap(p,q);
就更容易了。或者,如果提案真的在将来某个时候通过,p:=:q;
。@chris:Waaaat。你能链接到该提案吗?(搜索符号很困难。)@GManNickG,是的,当然……我很怀疑它是否成功。@chris:对不起,我是新来的。如果我通过引用传递,我如何处理副本?@MK:你需要取消引用指针。但是这很容易出错,因为它们可能为空,所以你应该使用引用。(请注意,实际上,您并不是通过引用传递任何内容。您传递的是发生在指针上的值。)我不清楚OP是想交换指针还是指针指向的值。@ShafikYaghmour OP所做的是交换指针,所以我想OP想交换指针指向的值。@MK您可以修改您的问题,以便清楚您不想修改指针,而是要修改指针的内容。@ShafikYaghmour,您不能物理交换指针但是,有两个东西的地址。return
语句不是无用的吗?它交换值,而不是任何指针。通过将函数声明为接受引用,您只是更改了swap
函数的语义。r=s
当r
和s
是引用时,意味着与*p=*q当p
和q
是指针时。通过观察存储p和q的内存位置,在调试器上检查它。如果您的目标是编写泛型函数,我建议使用模板。这样可以保证在编译时这两个参数兼容。我知道使用void*
(在这种情况下,void**
)不被视为最佳实践,但考虑到每个指针实际上是表示32/64位内存插槽的std::size\u t
(无符号)变量。使用void swap(void**A,void**B)
函数是否也能更好地处理其他数据类型?