将指针交换到C中的指针

将指针交换到C中的指针,c,function,pointers,swap,C,Function,Pointers,Swap,我有一个问题,涉及到调用一个函数,该函数包含指向指针的指针的两个参数 int main(void) { ... int *ptrp = &p, *ptrq = &q; int **ppp = &ptrp, **ppq = &ptrq; swap_ptr(ppp,ppq);/* &ptrp, &ptrq passed */ /* to swap_ptr() */ return 0; } void swap_ptr(int **ptrA,int

我有一个问题,涉及到调用一个函数,该函数包含指向指针的指针的两个参数

int main(void)
{ ...
int *ptrp = &p, *ptrq = &q;
int **ppp = &ptrp, **ppq  = &ptrq;
swap_ptr(ppp,ppq);/* &ptrp, &ptrq passed */ 
/* to swap_ptr() */
return 0;
}

void swap_ptr(int **ptrA,int **ptrB)...
我们必须交换ptrp和ptrq的值,那么这是否意味着在swap_ptr函数中,我只使用*ptrA和*ptrB来交换它们,还是其他指针语句


谢谢

是,
*ptrA
将引用
main
中的变量
ptrp
*ptrA
将引用
ptrq
。将这两个值交换为任何其他类型,此时
ptrp
将指向
q
ptrq
指向
p


因为这听起来像是家庭作业,所以我将让您拿出三行代码。

*ptrp指的是指针指向的值。 ptrp指指针的值(内存位置)


交换\u ptr可以简单地将其中一个值存储在tmp var中,然后交换这些值。

这与交换任何值的概念相同:

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
在这种情况下,您正好交换int*而不是int:

void swap(int** a, int** b)
{
    int* tmp = *a;
    *a = *b;
    *b = tmp;
}

我对这些算法/技术有点陌生,但我已经想出了这个函数

function swap(int *p1, int *p2) {
  *p1 = *p1 + *p2;
  *p2 = *p1 - *p2;
  *p1 = *p1 - *p2;
}
你可以这样测试这个函数

int a = 10;
int b = 20;

printf("%d %d\n", a, b); // 10 20

swap(&a, &b);

printf("%d %d\n", a, b); // 20 10

为了更好地理解,这里有三个步骤的解释

  • *p1=*p1+*p2
    将来自p1(*p1=10)和p2(*p2=20)的值相加,并将结果存储在p1(*p1=30)上
  • *p2=*p1-*p2
    我们知道加法的结果,通过从来自p1(*p1=30)的值减去p2(当前*p2=20)的当前值来计算p1的旧值,并将结果存储在p2(计算*p2=10)
  • *p1=*p1-*p2
    由于p1(*p1=30)的值在第2步没有改变,并且p2(*p2=10)上仍然有p1的旧值,因此我们可以将p2划分为p1,并将结果存储在p1(计算得出的*p1=20)
  • 如您所见,我们交换了两个
    int
    s,没有定义任何临时变量,也没有进行按引用传递函数调用


    通过引用传递的原因是为了最小化内存的使用。因为每次按值传递调用都会在内存上分配新变量(是否由GC删除),这取决于您向函数传递了多少参数。

    您的问题已经有了答案,所以我不太清楚为什么要问这个问题……你也可以用它来交换指针……@0x69有趣的事实:如果你用异或交换两个相同的指针,那么它们都将被设置为空指针。@Corbin这取决于你说的“相同指针”是什么意思。如果它意味着相同的指针变量-那么是的,您不能交换相同的变量-XOR交换必须应用于存储在不同内存地址的两个变量。但是,如果说“相同的指针”是指指向相同地址的不同指针变量,那么不,您可以完全交换这两个指针。例如,以下代码在XOR交换适用性方面100%有效=>
    void xorSwap(int**x,int**y){if(x!=y){*x=(int*)((int)*x^(int)*y);*y=(int*)((int)*x^(int)*y);*x=(int*)((int)*x^(int)*y);}int main(void){int a=7;int b=11;int*pa=&b;int*pb=&b;printf(“在%p%p/%d%d\n之前”,pa,pb,*pa,*pb,*pb);xorSwap(&pa,&pb);printf(“在%p%p/%d%d\n之后”,pa,pb,*pa,*pb);返回0;}
    非常感谢,这就是我所需要知道的-1这是一种非常危险的交换值的方法,正如@JoeHass中解释的为什么它是危险的?正如您在更新1中看到的那样,
    int
    的最大值没有任何问题。
    交换()的危险情况是什么原因造成的
    函数?您演示了它只工作一次,这与演示它始终工作有很大不同。您是否查看了C语言标准对有符号整数溢出时会发生什么的说明?