void和intmain()和main(void)的区别别


· 知道合伙人餐饮行家

勤奋如春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏


void和int都是函数的返回类型; void就是无返回类型,函数不返回任何值; int返回整数,函数必须返回整数结果。

你对这个回答的评价是?

int在这里就是返回值,有返回值的方法要使用return语句返回方法声明时对应的类型。比如这个方法你要反悔return int。也可以不返回那么int的位置就是void,也就不需要return语句。

你对这个回答的评价是?

void没有返回值,int要返回int型的值

你对这个回答的评价是?

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

许多初学者对C中的void 和void 的指针类型不是很了解。因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧。  

1、首先,我们来说说void 的含义:

void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: 
这行语句编译时会出错,提示“illegal use of type ’void’”。不过,即使void a的编译不会出错,它也没有任何实际意义。 
2、众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 例如:
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: 
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。呵呵,这个道理蛮简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错: 

void 指针是一种特殊的指针,表示为“无类型指针”,在 ANSI C 中使用它来代替“char*”作为通用指针的类型。由于 void 指针没有特定的类型,因此它可以指向任何类型的数据。也就是说,任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换,如下面的示例代码所示:

 
虽然如此,但这并不意味着可以无需任何强制类型转换就将 void 指针直接赋给其他类型的指针,因为“空类型”可以包容“有类型”,而“有类型”则不能包容“空类型”。正如我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”一样。因此,下面的示例代码将编译出错,如果在 V2010 中,将提示“a
 
由此可见,要将 void 指针赋值给其他类型的指针,必须进行强制类型转换。如下面的示例代码所示:
 

避免对void指针进行算术操作

 
ANSI C 标准规定,进行算法操作的指针必须确定知道其指向数据类型大小,也就是说必须知道内存目的地址的确切值。如下面的示例代码所示:
 
在上面的示例代码中,指针变量 p 的类型是“int*”,指向的类型是 int,被初始化为指向整型变量 a。
在执行语句“p++”时,编译器是这样处理的:把指针 p 的值加上了“sizeof(int)”(由于在 32 位系统中,int 占 4 字节,所以这里是被加上了 4),即 p 所指向的地址由原来的变量 a 的地址向高地址方向增加了 4 字节。但又由于 char 类型的长度是一个字节,所以语句“printf("%s",p)”将输出“tyuiopasdfghjkl”。
而对于 void 指针,编译器并不知道所指对象的大小,所以对 void 指针进行算术操作都是不合法的,如下面的示例代码所示:
 

但值得注意的是,GNU 则不这么认为,它指定“void*”的算法操作与“char*”一致。因此下列语句在 GNU 编译器中都是正确的:
 
下面的示例代码演示了在 中执行对 void 指针的自增操作:
 
运行结果为:
LoveC
由此可见,GNU 和 ANSI 还存在着一些区别,相比之下,GNU 较 ANSI 更“开放”,提供了对更多语法的支持。但是在真实的设计环境中,还是应该尽可能符合 ANSI 标准,尽量避免对 void 指针进行算术操作。

如果函数的参数可以是任意类型指针,应该将其参数声明为 void*

 
前面提到,void 指针可以指向任意类型的数据,同时任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换。因此,在编程中,如果函数的参数可以是任意类型指针,那么应该使用 void 指针作为函数的形参,这样函数就可以接受任意数据类型的指针作为参数。
比较典型的函数有内存操作函数 memcpy 和 memset,如下面的代码所示:
 /* 解决数据区重叠问题*/
 
这样,任何类型的指针都可以传入 memcpy 函数和 memset 函数中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。memcpy 函数的调用示例如下面的代码所示:
 
或者进行如下形式的调用:
 
因为参数类型是 void*,所以上面的调用都是正确的。现在假设 memcpy 函数的参数类型不是 void*,而是 char*,如下面的代码所示:
 
现在继续执行如下形式的调用:
 
由于类型不匹配,编译器就会报错。由此可见,这样的函数同时也失去了通用性。

我要回帖

更多关于 main()和main(void)的区别 的文章

 

随机推荐