免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1892 | 回复: 9
打印 上一主题 下一主题

[C] 请帮帮我,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-11 22:19 |只看该作者 |倒序浏览
为什么要在swapint(int m,int n)前面加void 可不可以不要,void它是什么意思?为什么要在最后
加return 0 可不可以不加,return 0在这里又是什么意思?
#include<stdio.h>
void swapint(int m,int n)
{
   int temp;
   temp=m;
   m=n;
   n=temp;
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("a=%d,b=%d\n",a,b);
   swapint(a,b);
   printf("a=%d,b=%d\n",a,b);
   return 0;
}
假设输入2 4
为什么运行的结果是:
   a=2,b=4
   a=2,b=4
而不是a=2,b=4
      a=4,b=2

#include<stdio.h>
void swapint(int *pm,int *pn)
{
   int temp;
   temp=*pm;
   *pm=*pn;
   *pn=temp;
}
int main()
{
   int a,b;
   int *pa,*pb;
   pa=&a;
   pb=&b;
   scanf("%d %d",pa,pb);
   printf("a=%d,b=%d\n",a,b);
   swapint(pa,pb);
   printf("a=%d,b=%d\n",a,b);
   return 0;
}
假设输入2 4
为什么这次运行的结果是:
   a=2,b=4
   a=4,b=2
请高手解析,万分感谢!

论坛徽章:
0
2 [报告]
发表于 2007-11-12 12:30 |只看该作者
这个问题....
楼主应该先学习一下基础知识

论坛徽章:
0
3 [报告]
发表于 2007-11-12 16:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2007-11-12 23:48 |只看该作者
建议看C语言基础书籍,可以看《C程序设计》谭浩强主编

论坛徽章:
0
5 [报告]
发表于 2007-11-15 22:27 |只看该作者
算了,还是自己去看书,一些自私的人

论坛徽章:
0
6 [报告]
发表于 2007-11-15 22:28 |只看该作者
原帖由 df174 于 2007-11-15 22:27 发表
算了,还是自己去看书,一些自私的人



年轻人。

论坛徽章:
0
7 [报告]
发表于 2007-11-16 00:52 |只看该作者
研读 C primer plus 时正好读到这里,同时新手,帮你解答一下:
如果函数的返回值为void ,那么可以在函数的末尾用 return; 来终止执行函数并把控制返回给调用函数,因为 return没有返回值,所以只能用于void类型的函数之中。
早期版本的C中,如果函数没有进行返回值声明,那麽默认返回int 类型,但是C99不再支持函数的默认设置。
如果不加void,可能在完全符合C99的编译器下通不过, 早期版本的编译器如果不加void返回类型,似乎 默认返回0。如果不加return, 似乎也会默认返回0。

论坛徽章:
0
8 [报告]
发表于 2007-11-16 01:25 |只看该作者

回复 #1 df174 的帖子

其他不说了,自己认真看书就会明白。return 0表示程序正常结束。

论坛徽章:
0
9 [报告]
发表于 2007-11-16 10:09 |只看该作者
void 可以叫它无类型,也可以叫它通用类型,如果光从函数返回值看它的作用,那是太小看它了。无类型又通类型并不矛盾,因为正因为无类型,它和其它类型兼容,就像O型血,所以可以很方便的转换成其它类型。举一个例子:char *p=(char *)malloc(size);//size>0;  大家都知道 malloc的返回值的类型是(void *),即:void * malloc(unsigned int size); 所以当它返回后,我们就在加一个(char *)就很方便的把(void *)类型转换成(char *)了。同样,如果你需要给一个结构体申请空间,则:struct structname * pstruct=(struct structname *)malloc(sizeof(struct structname));//这里又把(void *)转换成(struct structname *)了。而最重要的是,编译的时候不会发出警告(如果malloc这样定义就会: char * malloc(unsigned int )
关于void 还有一个经典的用法,那就是在早期的socket标准定义中,因为不同平台的socket结构不一样,所以就产生了不兼容问题,这个问题使用void就巧妙的解决了。假设:windows平台下struct in_addr{};20bytes. UNIX 的 struct in_addr为30个字节。其它这个问题用联合体很容易解决,但是当时C语法没有联合体这一说,所以给函数传参数的时候就直接用 (void *), 如: int function(void * in_addr, unsigned int size); 那么我们使用的时候就可以function(&win_in_addr, sizeof(win_in_addr)); UNIX的就可以(&unix_in_addr, sizeof(unix_in_addr)); 呵呵,如果没有看明白,你可以查一些有关资料。

论坛徽章:
0
10 [报告]
发表于 2007-11-16 10:18 |只看该作者
如果你把这类函数写在表达式里,void的作用就出来了。你可以试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP