我是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);
}
答案 0 :(得分:30)
您在交换功能中缺少*
个。尝试:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
这样,您不是只交换指针,而是将指针指向的int
交换为。
答案 1 :(得分:12)
您的swap()
函数 在时尚之后工作 - 它将a
和b
变量的值交换为{{1} }。不幸的是,这些与swap()
中的a
和b
不同 - 因此您实际上看不到交换它们的任何影响。
答案 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
函数内交换局部指针b
和swap
。它完全可以完美地交换它们。
如果你想交换这些指针指向的值,你应该相应地重新实现你的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))
效果很好。