简单的交换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()
本地变量a
和b
的值。 不幸的是,那些与main()
的a
和b
不同 – 所以你实际上看不到交换它们的任何效果。
在考虑指针时,您需要清楚一些抽象。
内存中的一个对象。 这可以是任何类型(和大小)。 例如,整数对象将占用内存中的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
局部指针a
和b
。 它应该完美地交换它们。
如果你想交换这些指针指向的值,你应该相应地重新实现你的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))
效果很好。