C语言传地址调用

来源:百度知道 编辑:UC知道 时间:2024/06/08 12:43:52
#include<stdio.h>

swap_1(int *p1, int *p2)
{
int *p;
p = p1;
p1 = p2;
p2 = p;
}

swap_2(int *p1, int *p2)
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}

swap_3(int *p1, int *p2)
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}

main()
{
int a, b;
a = 3; b = 7;
swap_1(&a, &b);
swap_2(&a, &b);
swap_3(&a, &b);

}
为什么swap_1不能交换a,b的值而swap_2可以? 为什么swap_3导致Segment fault?

1中只是改变了指针p1,p2所指向的地址,不会影响a,b的值;
2中改变了指针p1,p2指向地址的内容,因此影响a,b的值;
3中定义int *p,指针p没有初始化,可能指向任何地址,而它指向的地址一般都是不可访问的,因此产生的非法访问,使程序崩溃。这样改一下:
swap_3(int *p1, int *p2)
{
int data=100;
int *p=&data;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}让 p 指向一个正确的地址,就不会造成程序崩溃了。

1、值传递:不管怎么传,原来的实参的值都不会改变。
地址传递,原来的实参的值可能被改变。
打个比方:
值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。
地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。

2、例如:
#include<stdio.h>
point(char *pt)
main()
{char b[4]={'m','n','o','p'},*pt=b;
point(pt);
printf("%c\n",*pt);
}
point(char *p)
{p+=3;
*p='F';}//加上这一句就变了

*p1代表地址
p1代表地址里存放的数据
而主函数用的是函数返回的地址
而不是返回的值