关于指针的菜鸟问题 :)

kimsea 2006-03-01 04:40:40
最具有代表性的指针例子:
#include <stdio.h>
void interchange(int *u, int *v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); /* send addresses to function */
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int *u, int *v)
{
int temp;
temp = *u; /* temp gets value that u points to */
*u = *v;
*v = temp;
}

按照我的理解
函数应该是 void interchange(int u, int v);
u,v引用变量地址:&x,&y
u=&x,v=&y 然后u v进行交替,也就是x,y的地址交换
这样也就是x y的值交换了?
为什么不是下面的形式,请高手给菜鸟解释下 :)
难道 * 和 & 要成对使用吗?

#include <stdio.h>
void interchange(int u, int v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); /* send addresses to function */
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int u, int v)
{
int temp;
temp = u;
u = v;
v = temp;
}
...全文
151 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
AIGPTchina 2006-03-02
  • 打赏
  • 举报
回复
指针就是地址变量
watermelontx 2006-03-01
  • 打赏
  • 举报
回复
void interchange(int u, int v);
这种是值的传递.只交换形参

void interchange(int *u, int *v);
这种是指针传递,才真正将实参的值交换..
kimsea 2006-03-01
  • 打赏
  • 举报
回复
谢谢 happy__888 duduhaha 及以上的个位 :)
明白了,值参和行参的问题。。。。。 呵呵
upcuiling 2006-03-01
  • 打赏
  • 举报
回复
你完全理解错了
只有指针才能根据地址来改变地址所指的内存内容,如果你这样可以的话,int型和int型指针岂不是一样了。还有函数是不能改变实参值的,因为实参只是以一个副本在函数里进行操作,他一点事都没有。
但是如果实参是指针的话,则可以改变他所指向的内存,而指针本身是不边的,变得是他指向的内容
屋顶上的老猫 2006-03-01
  • 打赏
  • 举报
回复
看参数传递的章节,你要记住参数进行的是“值传递”!
duduhaha 2006-03-01
  • 打赏
  • 举报
回复
#include <stdio.h>
void interchange(long int u, long int v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
printf("addressX: %x addressY: %x\n",&x,&y);
interchange((long int)&x, (long)&y); /* send addresses to function */
printf("Now x = %d and y = %d.\n", x, y);
printf("addressX: %x addressY: %x\n",&x,&y);
return 0;
}
void interchange(long int u, long int v)
{
long int temp;
temp = u;
u = v;
v = temp;
}

我给你加了两条输出地址的语句,注意我新加的两条语句输出一样,这是因为传进去的指针实际上有个副本,在interchange函数中是对两个副本进行操作的.我可能说得不是很清楚,钱能的<<c++程序设计>>对这个阐述的比较好.
寻开心 2006-03-01
  • 打赏
  • 举报
回复
值参和行参

你需要理解函数是如何传递参数的
在c语言当中
函数并没有把你调用它的时候的变量本身带入函数当中
而只是把变量的具体数值带入其中了
所以在后面的例子当中
x =3, y=4
interchange(x,y);
这个调用并不是把x,和y传入函数,而是把x和y的数值传入函数内部
这两个数值,在函数内部是两个新的变量的值,这两个新的变量u和v和x与y没有直接的关系
同样在函数内部把u和v的数值交换了,对于x和y没有任何影响

相反,前面的例子传入的是x和y这两个变量的地址
新的变量u和v交换的不是指针,而是指针指向的位置的内容,这个交换是会直接影响到x和y的
为什么,自己想吧
AllenCpp 2006-03-01
  • 打赏
  • 举报
回复
void interchange(int u, int v)
这样就不能起到
temp = u;
u = v;
v = temp;的效果,函数返回不会有交换的
void interchange(int *u, int *v)是地址的传递
我不知道我有没有说清楚,多看看书吧~
FBIq 2006-03-01
  • 打赏
  • 举报
回复
形参和实参类型不一致
补充一点:如果你要实现真正的交换两个变量的值应该按引用传递

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧