简单的交换function……为什么不交换这个?

我是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); } 

你在交换函数中缺少* s。 尝试:

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

这样,你不是交换指针,而是交换指针指向的int

你的swap()函数在时尚之后确实有效 – 它交换了swap()本地变量ab的值。 不幸的是,那些与main()ab不同 – 所以你实际上看不到交换它们的任何效果。

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

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

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

int i;

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

我会在内存中给你这个对象的地址。

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

int * ptr;

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

ptr =&i;

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

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

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

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

尝试这样的事情

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

正确的方法:

 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. } 

它交换。 它在swap函数内swap局部指针ab 。 它应该完美地交换它们。

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

嗯也许用这个

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

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

不使用第三个变量(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 } 

你需要发送a和b的地址作为交换function,所以在调用swap函数时你必须调用ass swap(&a,&b)这样你就传递了地址,并改变了地址

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

效果很好。