对于指针做为形参的处理过程一问?跪求了呀
程序一:#include <stdio.h>
#include <stdlib.h>
void swap(int *p[])
{
int *temp;
temp=p[0];//指针temp指向p[0]的指向也就是0240FF5C
p[0]=p[1];//p[0]放弃原来的0240FF5C转而指向0240FF58
p[1]=temp;//p[1]放弃原来的0240FF58转而指向0240FF5C,这个过程完了之后虽然形参没有了,但是返回实参后对指针首址的指向改变仍然存在,所以就交换了。
}
main()
{
int a=10,b=20,*p[2]={&a,&b};
printf("%p,%p\n",p[0],p[1]);
swap(p);
printf("%p,%p\n",p[0],p[1]);
}的执行结果为:
0240FF5C,0240FF58
0240FF58,0240FF5C
请按任意键继续. . .
程序二:
#include <stdio.h>
#include <stdlib.h>
void swap(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
main()
{
int a=10,b=20,*p1=&a,*p2=&b;
printf("%p,%p\n",p1,p2);
swap(p1,p2);
printf("%p,%p\n",p1,p2);
}执行结果为:
0240FF5C,0240FF58
0240FF5C,0240FF58
请按任意键继续. . .
本来程序一我明白了,不过一看二就糊涂了,我的理解如下:
对于程序一:如上注释;但是对于程序二不也和程序一一样吗,为什么一返回主函数指针的指向就没有交换?
实在是不明白程序二是为什么呀,大家快帮下忙呀,跪求了 #include <stdio.h>
#include <stdlib.h>
void swap(int **p1,int **p2)
{
int *temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a=10,b=20,*p1=&a,*p2=&b;
printf("%p,%p\n",p1,p2);
swap(&p1,&p2);
printf("%p,%p\n",p1,p2);
return 0;
} 刚说完明白了,还以为你真的明白了呢。
标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指针的目标。 再次谢谢楼上朋友,哈哈,这回我终于明白了,通过如下过程可以证明:(指针数组、数组、指针,变量等类似)
#include <stdio.h>
#include <stdlib.h>
void swap(int *p1,int *p2)
{
printf("%p,%p\n",&p1,&p2);
}
main()
{
int a=10,b=20,*p1=&a,*p2=&b;
printf("%p,%p\n",&p1,&p2);
swap(p1,p2);
}编译结果为:
0240FF54,0240FF50
0240FF38,0240FF3C
请按任意键继续. . .
这就可以证明了当指针做参数时,形参相当于另外定义了指针,只是与实参的指向相同,所以通过直接交换形参指针的方法是不能完成对实参的改变的,忙了我一天呀
[[it] 本帖最后由 lqlayy 于 2008-5-11 17:21 编辑 [/it]] C语言没有引用传递,完毕……
十三秒的奇迹!
指针是用来传址的,能用来传值吗? swap(p1,p2)??!!不对 [quote][bo]以下是引用 [un]forever74[/un] 在 2008-5-11 12:34 的发言:[/bo]
刚说完明白了,还以为你真的明白了呢。
标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指 ... [/quote]
很是赞同,因为普通形参在函数内部可以改变其值,但无法改变其实际参数的值,而指针传递的是一个地址,相当于C++中的引用了。另外,在传递字符数组时,也常使用指针传递,而不是使用字符数组。 LS:指针不是引用 C语言 可以用 值传递 和传引用
地址是什么 地址也是 一个数值对吧
传引用 你 吧 地址的 数值都传过去了 修改地址数值所 代表的值 不是 很简单么
可以说 所以编程语言 的 传递 都可以用 C语言 进行
有人说JAVA没指针 形式而已 但是本质还是值传递,间接引用是要消耗CPU时间的。而C++的引用是直接使用原变量,效率比值传递要高。 java只有引用概念..它基本把=右边看成常对象和堆对象,左边都是引用..包括函数参数,没有副本拷贝概念
页:
[1]
