【问题标题】:void pointer swap function in CC中的void指针交换函数
【发布时间】:2021-01-15 11:06:58
【问题描述】:

我写了一个 func swap_pointers 来替换两个指针指向的内存地址。

意思是如果在调用swap之前,v_a指向int av_b指向b,之后v_a应该指向b,而v_b指向a

运行main(),我确实看到了地址开关,并且调用printf() 确实打印了6 8,但是当行时

a = *((int *) v_a);
b = *((int *) v_b);

被执行,两个 vars(ab)收到值 6
我不明白为什么会这样。

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

int main() {
  int a = 8;
  int b = 6;
  void *v_a = &a;
  void *v_b = &b;
  swap_pointers(&v_a, &v_b);
  printf("%d %d\n", *((int *) v_a), *((int *) v_b));
  a = *((int *) v_a);
  b = *((int *) v_b);

}

【问题讨论】:

  • 这能回答你的问题吗? Swapping objects using pointers
  • 请注意,如果您这样做 int new_a = *((int *) v_a); int new_b = *((int *) v_b);,这不会发生。你认为为什么会这样? :)
  • 无关:你为什么不使用std::swap(v_a, v_b);

标签: c pointers memory swap void-pointers


【解决方案1】:

进行交换后,v_a 指向b 的地址,v_b 指向a 的地址。

然后,当你这样做时:

a = *((int *) v_a);

您实际上是在将 b 的值分配给 a,因此它是 6。

当然,当您在下一行对b 进行赋值时,您正在分配a 的新值,即6。

【讨论】:

    【解决方案2】:

    调用函数swap_pointers

    swap_pointers(&v_a, &v_b);
    

    指针v_a指向变量b,指针v_b指向变量a。

    这句话之后

    a = *((int *) v_a);
    

    变量a 的值为6。指针v_b指向的变量a此时包含值6..所以在这个语句之后

    b = *((int *) v_b);
    

    变量b会得到存储在前面赋值语句中得到的变量a中的值与6相同的值。

    要交换变量ab 中的值,您需要使用一个中间变量或编写另一个函数来交换int 类型的对象中的值。

    例如

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

    函数可以这样调用

    swap_integers( v_a, v_b );
    

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2011-07-31
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      相关资源
      最近更新 更多