| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1056 人关注过本帖
标题:两个程序比较
只看楼主 加入收藏
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
 问题点数:0 回复次数:12 
两个程序比较
比较两个程序,
#include<stdio.h>
void s(int *x,int *y)
{
int a;
a=*x;
*x=*y;
*y=a;
printf("%d %d\n",x,y);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d %d\n",a,b);
s(&a,&b);
printf("%d %d\n",a,b);/*可以修改*/
return 0;
}

#include<stdio.h>
void s(int *x,int *y)
{
int *a;
a=x;
x=y;
y=a;
printf("%x %d\n",x,y);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d %d\n",a,b);
s(&a,&b);
printf("%d %d\n",a,b);/*不可以修改*/
return 0;
}
大家都是形式参数定义为指针类型,第一个程序可以改变,而第二个程序不可以改变为什么,划线是我想知道部分。
搜索更多相关主题的帖子: void include return 
2006-10-16 18:41
jiangzw625
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2006-3-27
收藏
得分:0 
注意,在第二个程序中你传得两个形参也是按值传递的。
可以这么说 ,实际上在函数的传参没有传址的。
第一个程序能修改的原因是
你的两个形参被赋给了把实参的地址了,他们是独立的,可恰恰地址相同,所以你可以根据地址修改数据。

马马乎乎
2006-10-16 19:07
编程新贵
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2006-8-11
收藏
得分:0 
以下是引用jiangzw625在2006-10-16 19:07:38的发言:
注意,在第二个程序中你传得两个形参也是按值传递的。
可以这么说 ,实际上在函数的传参没有传址的。
第一个程序能修改的原因是
你的两个形参被赋给了把实参的地址了,他们是独立的,可恰恰地址相同,所以你可以根据地址修改数据。

不同意2楼的
 1. 首先2个函数传递的都是地址
 2. 第一个程序的函数是对实参的值进行3元交换,所以值能改变.
    第二个程序的函数是对实参的地址进行3元交换,而内存的地址单元在内存中是固定的,不可能被交换掉,所以,没有改变.

2006-10-16 19:38
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
这个程序说明什么问题
#include<stdio.h>
void s(int *x,int *y)
{
int *a;
a=x;
x=y;
y=a;
printf("\n 自定义函数体内S:%x %x %d %d\n",x,y,*x,*y);
}
void s1(int *x,int *y)
{
int a;
a=*x;
*x=*y;
*y=a;
printf("\n 自定义函数休内S1:%x %x %d %d\n",x,y,*x,*y);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("\n 初地址:a=%x b=%x\n",&a,&b);
s(&a,&b);
printf("\n 主函数S:%d %d %x %x\n",a,b,&a,&b);
s1(&a,&b);
printf("\n 主函数S1:%d %d %x %x\n",a,b,&a,&b);
return 0;
}

谁有强殖装甲第二部,可以Q我460054868
2006-10-16 19:39
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 

可不可以详细一点


谁有强殖装甲第二部,可以Q我460054868
2006-10-16 21:38
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 

这些要自己解答,要改变实形,地址要改变,还有值在变。


谁有强殖装甲第二部,可以Q我460054868
2006-10-16 22:13
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
函数1.传递数值的地址,但函数体中交换的是两地址,这样行参本身的值所在地址是一样的.即x,y的地址交换了,但他们两个指向的内容没有改变.这里行参(地址)的改变并不能改变实参(地址).所以主函数的值还是没有改变.
函数2.传递数值的地址,但函数体内交换了是两地址所指向的值.同样参数(地址不会改变),但其内容已经改变.

倚天照海花无数,流水高山心自知。
2006-10-16 22:17
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
言之有理

谁有强殖装甲第二部,可以Q我460054868
2006-10-16 22:22
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
收藏
得分:0 
你衣服里有100元钱,我衣服里有10元钱,执行
void s(int *x,int *y){
int *a;
a=x;
x=y;
y=a;
return ;
}
后,好比你的衣服我穿着,我的衣服你穿着,这样我的衣服里始终只有10元钱,你衣服里始终有100元。(我的衣服还是我的,你的还是你的)

而执行

void s1(int *x,int *y){
int a;
a=*x;
*x=*y;
*y=a;
return ;
}
后,好比把你的钱放进我的口袋,把我的钱装进你的口袋,这是我的口袋里就有100,你就只有10元。






由于工作,N久都没来了!
2006-10-16 22:26
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
不愧是数学系的人,值得学习

谁有强殖装甲第二部,可以Q我460054868
2006-10-16 22:29
快速回复:两个程序比较
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023690 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved