总结:
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
1. 如果函数没有返回值,那么应声明为void类型;
2. 如果函数无参数,那么应声明其参数为void;
3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void * ;
4. void不能代表一个真实的变量;
规则:
1.如果无返回类型,就加上void,否则默认为int型,不加有的编译器会报错或警告
2.如果函数无参数,那么应声明其参数为void
3.慎用void *,能确定类型的最好不要用
1.void
1)void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,void a;会报错“integal use of type void”
2)void真正作用:对函数返回的限定,可以表示无返回值;对函数参数的限定,可以表示无参数;
3)在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回int值处理。但是许多程序员却误以为其为void类型
如:(不加返回值类型,报不报错,警告不警告和编译器有关,xcode会警告)
4)如果函数无参数,那么应声明其参数为void
申明这样一个函数
void param(){
printf("no param \n");
}
在c语言中,可以这样调用,不报错.说明给无参数的函数可以传递任意类型的参数。(但是在c++中同样的代码会报错)
但是如果函数参数申明为void就,如此调用就会报错。所以无论在c还是c++,如果函数无参数,那么应声明其参数为void
2.void *
1)void *,任何类型的指针都可以直接赋值给它,无需进行强制类型转换,有类型的就不能直接赋值:
如: void *p1;int *p2; p1 = p2;
float *p1; int *p2; p1 = p2; "p1= p2"会报错“cannot convert from"int *" to "float"”,必须强转,p1 = (float *)p2;
2)不能把void*量量赋值给有类型的变量,
如:void *p1;int *p2; p2 = p1;报错“cannot convert from"void *" to "int"”
3)能确定类型的,最好不要用void*
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
且在ANSI,pvoid++会增大sizeof,VC6.0测试时sizeof的双倍
//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
但是我在xcode(GNU)里面运行时可以的,sizeof也没有增加
所以为了支持更多语法,能确定的类型还是不要用void*
其他:
1.引用可以是void类型吗
答:引用只是一个别名,是已有变量的别名,而void类型是空类型,是没有分配内存的。所以引用不能是void类型。
引用必须是某个量的别名,必须要有类型
2.void test(void)和 void test()是一个意思,标示没有参数,无任何实际参数
3.void *可以作为传递参数
列如:备注,传递的时候,最好在加一个参数 void的size
网友评论