初学者的函数指针问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 20:53:46
swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
main()
{
int a,b,*p1,*p2;
printf("a,b= ");
scanf("%d %d",&a,&b);
p1=&a;p2=&b;
printf("p1=%d,p2=%d\n",p1,p2);
if(a<b)
swap(p1,p2);
printf("%d,%d\n",a,b);
system("pause");
}

1,为什么实参没变?

swap(int *p1,int *p2)

{int *p;

p=p1;

p1=p2;

p2=p;

}

main()

{

int a,b;

int *pointer_1,*pointer_2;

scanf("%d,%d",&a,&b);

pointer_1=&a;pointer_2=&b;

if(a<b) swap(pointer_1,pointer_2);

printf("\n%d,%d\n",*pointer_1,*pointer_2);

}

2,不能企图通过改变指针形参的值而使指针实参的值改变,怎么理解?
pur_e 说的 交换的临时变量 正如 hychyc所说的,临时变量在调用结束后就释放对吗

1、第一个,函数在被调用的时候,形参int x,int y是申请的临时变量,跟传进来的参数只是值一样,但不是同一个变量,所以交换的只是临时变量,实参没有改变

2、我们说的传指针能改变指向的数据的值,注意这里的表达,是指向的数据的值,而不是指针的值,因为指针在传递的时候跟普通数据类型是一样的,swap(int *p1,int *p2)这两个指针p1,p2是在调用函数时申请的临时变量,只不过它们指向我们想要改的数据,用*p1和*p2交换是可以改变a和b的值的,但是交换指针的话,其实还是交换的临时变量

临时变量不一定被释放,比如你返回一个引用
int &fun()
{
int a;
return a;
}
编译器发现你在之后还会用到,就会延长生存周期,这个返回值还是有效地

答:
楼主的题出自谭浩强的书吗?

1,为什么实参没变?

C语言中函数的传递包括值传递和地址传递两种,其实VB中也是这样的,只是C语言中使用了指针,更加具有灵活性。

对于值传递,当主函数调用子函数时,是临时给子函数开辟一段内存,把主函数调用时的实参值送进去。当调用结束后,就释放内存,所以主函数的实参值并没有改变。(显然开辟的这段内存跟实参不在一个地址)

对于地址传递,同样是临时给子函数开辟一段内存,把主函数调用时的实参值送进去。但楼主要知道因为实参值是地址,所以此时内存里存放的是地址。子函数根据这个地址把此地址对应的内存中的数据改变了。实参值本身其实还是并没有改变。
所以在第二问中,a b的值会改变。

2,不能企图通过改变指针形参的值而使指针实参的值改变,怎么理解?

如前所述:指针形参的值和指针实参的值跟实参、形参是一回事。在不同的内存空间,就如同不能通过改变形参改变实参一样,也不能通过改变形参地址改变实参地址。

1.这种情况又是局部和全局的问题,当你把swap函数里的代码写到main函数里实参就会更改了
2.改变形参的值是无法改变实参的值的!!