【问题标题】:Why aren't the values swapped为什么没有交换值
【发布时间】:2014-01-24 14:12:09
【问题描述】:
#include <stdio.h>
#include <string.h>

void swap(int *p1, int *p2) 
{
  int *temp;
temp=p1;
p1=p2;
p2=temp;
}

main()
{
int n1=10,n2=20;
printf("%d,%d\n",n1++,++n2);
swap(&n1,&n2);
printf("%d,%d",++n1,n2++);
}

当我运行此代码时,输​​出为 10,21 和 12,21。我的问题是为什么 N1 和 N2 的值没有交换?由于函数交换使用指针并且方法是通过引用调用的,它们不应该交换吗?还是我错过了一些概念?提前致谢

【问题讨论】:

  • 如果你想实现引用语义,你需要在你的被调用者的某个点dereference

标签: c pointers swap


【解决方案1】:

您已经交换了指针而不是值。请记住,C 专门使用按值传递,因此这些指针是按值传递的。要交换它们引用的内容,您需要取消引用指针。

void swap(int *p1, int *p2) 
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

解决此问题的一种方法是您需要分配int 类型的值。但是您的代码分配了int* 类型的值。因此,纯粹基于仅基于类型的分析,您可以拒绝您的代码。

【讨论】:

    【解决方案2】:
    void swap(int *p1, int *p2) 
    {
        int temp;
        temp=*p1;
        *p1=*p2;
        *p2=temp;
    }
    

    【讨论】:

      【解决方案3】:

      您在 swap() 函数中交换的指针是该函数的局部变量。所以这个交换在这个函数之外没有任何影响。

      要正确交换值,请使用 Wojtek 发布的代码。

      您可能还想看看这个问题:What is the fastest way to swap values in C?

      答案使用了异或交换算法。

      【讨论】:

        【解决方案4】:

        如下改变你的交换函数

        void swap(int *p1, int *p2) 
        
            {
              int temp;
            temp=*p1;
            *p1=*p2;
            *p2=temp;
            }
        

        注意:您尝试在 swap 函数中对变量的地址进行赋值

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          • 2022-07-04
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多