C语言问题,,,求详细解释,,麻烦了

voidfunc(int*p1,intp2){inttmp;tmp=*p1;*p1=p2;p2=tmp+2}mian{int=8,y=18;func(&x,y);prin... void func(int*p1,intp2)
{
int tmp;
tmp=*p1;
*p1=p2;
p2=tmp+2
}
mian
{
int=8,y=18;
func(&x,y);
printf("%d,%d\n",x,y);
}
展开
 我来答
百度网友6fe74e2
2013-01-24 · TA获得超过6593个赞
知道大有可为答主
回答量:1973
采纳率:100%
帮助的人:276万
展开全部
代码有错,修改一下:
#include "stdio.h"//包含头文件
void func(int*p1,int p2)
{
int tmp;
tmp=*p1;
*p1=p2;//将形参p2的值赋给地址p1指向的变量,从面达到了改变实参的值的目的
p2=tmp+2;//形参p2的值变成了*p1+2,但实参的值不变
}
void main()//main是个函数,不是mian,而且也最好加上返回值。
{
int x=8,y=18;
func(&x,y);//运行之后,x的值变成了y的值18,y的值不变。
printf("%d,%d\n",x,y);//最后输出是18,18
}
Apple林
2013-01-24 · TA获得超过2093个赞
知道小有建树答主
回答量:895
采纳率:66%
帮助的人:555万
展开全部
结果是:18,18
因为void func(int*p1,intp2)声明的是p1是指针类型,所以是传指针,而p2是传值;
因此在func内部数据交换会影响x,但是不会影响y,
所以x变成18,而y不变。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
outspaceman19
2013-01-24 · TA获得超过1080个赞
知道小有建树答主
回答量:749
采纳率:100%
帮助的人:413万
展开全部
不少同学在学到C语言的指针部分时感到很困惑,对经常提到的“值传递”和“地址传递”两个概念弄不明白。实际上,因为地址本身也可以作为一个特殊的“值”,所以地址传递也是一种特殊的值传递。只是为了强调其特殊性,故称之为“地址传递”。我们在学习过程中可以视参数的形式而区别对待,比如若参数传递的是简单数据类型的数值,则将其归类为值传递方式;若参数传递的是变量的地址,则视其为地址传递方式。
值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
下面我们用书上出现频率最高的一个程序来分别实现值传递过程和地址传递过程。

void swap(int x,int y)
{ int temp;
temp=x;
x=y;
y=temp;
printf("/n(swap):%d,%d/n",x,y);
}
void main()
{ int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
printf("/n(main):%d,%d/n",a,b);
}

这显然是一个值传递的过程。假设我们从键盘输入两个数据:5,9,先来看一下运行结果:

(swap):9,5
(main):5,9

按照值传递的特点,我们可以很清楚的看到,虽然在swap函数中暂时使得运行结果显示了交换后的数据,即达到了交换的目的,但实际情况却是随着swap函数的结束,被作为局部参数的形参x,y以及swap函数本身的局部参数temp都将结束其生存期,在内存中的存储空间被释放。因此实参a,b的并未受到影响,依然保持原值。
从这道程序中我们也可以学到一个方法,比如有时不需要修改实参,但是又需要被调函数所作的工作能够得以体现,就可以灵活的在被调函数中使用打印语句。因此上面的程序可以改写为:

void swap(int x,int y)
{ int temp;
temp=x;
x=y;
y=temp;
printf("/n从大到小排列的顺序为:%d,%d/n",x,y);
}
main()
{ int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
}

在输入5,9两个数字后,得到的执行结果是:
从大到小排列的顺序为:9,5
你看这样就可以使用相对容易理解的值传递方式,巧妙的解决问题了,并得到了想要的答案,虽然我们并未真正的让主函数中的两个变量发生改变。
再来看地址传递方式:

void swap(int *p,int *q)
{ int temp;
temp=*p;
*p=*q;
*q=temp;
}
void main()
{ int a,b;
int *pointer_1=&a,*pointer_2=&
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
printf("/n%d,%d/n",a,b);
}

假设我们从键盘输入两个数据:5,9,先来看一下运行结果:

9,5
在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。
这一部分内容对初学者来说理解起来有一定的难度,所以在学习过程中一定要多想多练多思考,希望以上的讲解能对初学者有所帮助。

参考资料: http://blog.csdn.net/sdfgh2046/article/details/4974427

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wuwei_aitinger
2013-01-24
知道答主
回答量:9
采纳率:0%
帮助的人:3.7万
展开全部
#include<stdio.h>
void func(int *p1,int p2)
{
int tmp;
tmp = *p1;
*p1 = p2;
p2 = tmp + 2;
}
void main(void)
{
void func(int *p1, int p2);
int x =8;
int y =18;
func(&x,y);
printf("%d,%d\n",x,y);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式