关于指针的菜鸟问题 :)
最具有代表性的指针例子:
#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;
}
问题点数:20、回复次数:9Top
1 楼FBIq(aiby)回复于 2006-03-01 16:51:26 得分 0
形参和实参类型不一致
补充一点:如果你要实现真正的交换两个变量的值应该按引用传递Top
2 楼AllenCpp(AllenCpp)回复于 2006-03-01 16:54:03 得分 0
void interchange(int u, int v)
这样就不能起到
temp = u;
u = v;
v = temp;的效果,函数返回不会有交换的
void interchange(int *u, int *v)是地址的传递
我不知道我有没有说清楚,多看看书吧~Top
3 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-01 16:58:29 得分 0
值参和行参
你需要理解函数是如何传递参数的
在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的
为什么,自己想吧Top
4 楼duduhaha(三人行必有我师)回复于 2006-03-01 16:58:56 得分 0
#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++程序设计>>对这个阐述的比较好.Top
5 楼cyberHunK(→迈克·老猫←)回复于 2006-03-01 17:00:58 得分 0
看参数传递的章节,你要记住参数进行的是“值传递”!Top
6 楼upcuiling()回复于 2006-03-01 17:03:19 得分 0
你完全理解错了
只有指针才能根据地址来改变地址所指的内存内容,如果你这样可以的话,int型和int型指针岂不是一样了。还有函数是不能改变实参值的,因为实参只是以一个副本在函数里进行操作,他一点事都没有。
但是如果实参是指针的话,则可以改变他所指向的内存,而指针本身是不边的,变得是他指向的内容Top
7 楼kimsea(小鸟)回复于 2006-03-01 17:21:25 得分 0
谢谢 happy__888 duduhaha 及以上的个位 :)
明白了,值参和行参的问题。。。。。 呵呵Top
8 楼watermelontx(晨曦)回复于 2006-03-01 19:24:25 得分 0
void interchange(int u, int v);
这种是值的传递.只交换形参
void interchange(int *u, int *v);
这种是指针传递,才真正将实参的值交换..Top
9 楼wcg_jishuo()回复于 2006-03-02 14:30:22 得分 0
指针就是地址变量Top




