Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;交换指针_C++_Pointers - Fatal编程技术网

C++ C++;交换指针

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

我正在研究一个交换指针的函数,我不明白为什么这个函数不起作用。当我在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);
    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)
函数是否也能更好地处理其他数据类型?