学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
 12 12
发新话题
打印

对于指针做为形参的处理过程一问?跪求了呀

对于指针做为形参的处理过程一问?跪求了呀

程序一:
#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
请按任意键继续. . .
本来程序一我明白了,不过一看二就糊涂了,我的理解如下:
对于程序一:如上注释;但是对于程序二不也和程序一一样吗,为什么一返回主函数指针的指向就没有交换?
实在是不明白程序二是为什么呀,大家快帮下忙呀,跪求了

TOP

#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;
}

TOP

刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指针的目标。

TOP

再次谢谢楼上朋友,哈哈,这回我终于明白了,通过如下过程可以证明:(指针数组、数组、指针,变量等类似)
#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
请按任意键继续. . .
这就可以证明了当指针做参数时,形参相当于另外定义了指针,只是与实参的指向相同,所以通过直接交换形参指针的方法是不能完成对实参的改变的,忙了我一天呀

[ 本帖最后由 lqlayy 于 2008-5-11 17:21 编辑 ]
学习编程的秘诀是:编程,编程,再编程;

TOP

C语言没有引用传递,完毕……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

十三秒的奇迹!

指针是用来传址的,能用来传值吗?
真理往往掌握在少数人手中,可现实却是少数服从多数!

TOP

swap(p1,p2)??!!
不对

TOP

引用:
以下是引用 forever74 在 2008-5-11 12:34 的发言:

刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指 ...
很是赞同,因为普通形参在函数内部可以改变其值,但无法改变其实际参数的值,而指针传递的是一个地址,相当于C++中的引用了。另外,在传递字符数组时,也常使用指针传递,而不是使用字符数组。

TOP

LS:指针不是引用
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

C语言 可以用 值传递 和传引用  


地址是什么  地址也是 一个数值对吧  
传引用 你 吧 地址的 数值都传过去了  修改地址数值所 代表的值  不是 很简单么



可以说  所以编程语言 的 传递  都可以用 C语言 进行

有人说JAVA没指针 形式而已

TOP

 12 12
发新话题