简单的交换功能......为什么不交换这个?

时间:2010-10-01 01:19:34

标签: c pointers

我是C的新手,仍在努力掌握指针的概念。我知道如何编写一个有效的交换函数...我更关心的是为什么这个特殊的函数没有。

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

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}

12 个答案:

答案 0 :(得分:30)

您在交换功能中缺少*个。尝试:

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

这样,您不是只交换指针,而是将指针指向int交换为

答案 1 :(得分:12)

您的swap()函数 在时尚之后工作 - 它将ab变量的值交换为{{1} }。不幸的是,这些与swap()中的ab不同 - 因此您实际上看不到交换它们的任何影响。

答案 2 :(得分:4)

在考虑指针时,你需要清楚一些抽象。

内存中的对象。这可以是任何类型(和大小)。例如,整数对象将占用内存中的4个字节(在32位机器上)。指针对象将占用内存中的4个字节(在32位机器上)。很明显,整数对象包含整数值;指针对象保存其他对象的地址。

C编程语言允许符号(变量)在内存中表示这些对象。当你申报时,

int i;

符号(变量)i表示内存中的某个整数对象。更具体地说,它代表了这个对象的价值。您可以在程序中使用i来操作此值。

& i将在内存中为您提供此对象的地址。

指针对象可以保存另一个对象的地址。您可以使用语法

声明指针对象

int * ptr;

与其他变量一样,指针变量表示对象的值,指针对象。这个值恰好是某个其他对象的地址。您可以像这样设置指针对象的值,

ptr =& i;

现在,当你在程序中说ptr时,你指的是它的值,即i的地址。但是如果你说* ptr,你指的不是ptr的值,而是指地址在ptr中的对象的值,即i。

交换函数的问题在于您交换指针的值,而不是这些指针保存地址的对象的值。要获得对象的值,您必须使用* ptr。

答案 3 :(得分:2)

C是一种按值传递的语言。你的swap例程没有取消引用传递给它的指针,因此从main的角度来看,没有任何事情发生过。

答案 4 :(得分:1)

指针按值传递。这意味着& b从函数返回时仍然是a和b;

尝试这样的事情

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

答案 5 :(得分:1)

正确的方法:

void swap(int* a, int* b)
{
    int temp = *a;  // Temp is set to the value stored at a (5)
    *a = *b;        // value stored at a is changed to the value stored at b (10)
    *b = temp;      // value stored in address b is changed to 5. 
}

答案 6 :(得分:1)

确实交换了。它在a函数内交换局部指针bswap。它完全可以完美地交换它们。

如果你想交换这些指针指向的值,你应该相应地重新实现你的swap函数,即让它交换指向的值,而不是指针。

答案 7 :(得分:1)

嗯,也许正在使用这个

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

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(&a, &b);
 printf(“%d %d\n”), *a, *b);
}

答案 8 :(得分:1)

不使用第三个变量(temp)

void swap(int* a,int* b)
{ 
 // a = 10, b = 5;
  *a = *a + *b;  // a now becomes 15
  *b = *a - *b;  // b becomes 10
  *a = *a - *b;  // a becomes 5
}

答案 9 :(得分:0)

zildjohn1的答案是最简单,最清晰的方法。但是,如果你坚持交换指针,那么你必须将指针传递给指针,因为指针本身是按值传递的。

答案 10 :(得分:-1)

您需要发送a和b的地址作为交换功能,因此在调用交换功能时您必须调用ass swap(& a,& b) 这样你就可以传递地址,并改变地址

答案 11 :(得分:-1)

#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b))

效果很好。