void类型详解
C语言中void有什么作用
C语言中void有什么作用void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
那么C语言中void具体有什么作用呢?一起来学习下吧:1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1) 对函数返回的限定;(2) 对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float *p1;int *p2;p1 = p2;其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void *p1;int *p2;p1 = p2;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
void在c++中的用法
void在c++中的用法
在C++中,void是一种数据类型,表示无返回值的函数或指针。
具体用法如下:
1. 声明无返回值的函数:
void functionName(parameters);
2. 定义无返回值的函数:
void functionName(parameters) {
// 函数体
}
3. 声明一个指向 void 的指针:
void* ptr;
4. 声明一个指向无返回值函数的指针:
void (*functionPtr)(parameters);
5. 在函数中使用 void 作为占位符:
void functionName(void) {
// 函数体
}
6. 在函数中使用 void 作为参数类型:
void functionName(int param1, void* param2) {
// 函数体
}
7. 使用 void 类型变量:
void variableName;
总的来说,void主要用于声明和定义无返回值的函数、声明指向 void 类型的指针以及作为函数参数类型和变量类型。
assert void方法
void 类型的使用技巧void 类型是 Java 中一种特殊的类型,用于表示没有返回值的函数或方法。
在 Java 中,void 类型通常用于表示操作没有结果,例如删除一个文件、关闭一个数据库连接等。
在使用 void 类型时,需要注意一些细节。
例如,如果使用 void 类型的函数或方法,需要在函数或方法的括号中指定返回值类型,例如:```javavoid deleteFile(String file 路径) {// 删除文件}```在上面的代码中,deleteFile 方法没有返回值,但是需要在函数的括号中指定返回值类型为 void。
另外,void 类型的函数或方法不能使用 return 语句返回值。
如果使用 return 语句,将会抛出异常。
例如:```javavoid addNumbers(int a, int b) {return a + b;}```在上面的代码中,addNumbers 方法没有返回值,但是如果使用return 语句返回 a + b 的值,将会抛出异常。
在 void 类型的函数或方法中,可以使用 assert 语句检查条件是否为真。
assert 语句可以用于确保代码在特定条件下执行,例如在单元测试中,可以使用 assert 语句检查数据是否满足预期。
例如: ```javavoid printHelloMessage() {assert true : "Should print hello message";// 输出 Hello 消息}```在上面的代码中,printHelloMessage 方法在执行时,需要确保条件 true 为真,否则将会抛出异常。
void 类型的使用技巧对于提高 Java 代码的可读性和可维护性至关重要。
在 void 类型的函数或方法中,需要注意返回值类型、使用 return 语句以及使用 assert 语句检查条件是否为真。
void作用
Void
1.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a 的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
2、任何类型的指针都可以直接赋值给void *类型,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
void和空指针
void和空指针在计算机编程中,void和空指针是两个常见的概念。
它们分别代表着不返回任何值和指向空地址的指针。
下面将分别介绍它们的含义和用法。
void是一种特殊的数据类型,它表示“无类型”或“没有值”。
在函数定义中,如果函数不需要返回任何值,就可以使用void作为返回类型。
例如,下面是一个不返回任何值的函数:void printHello() {printf("Hello World!\n");}在这个函数中,我们使用了void作为返回类型,因为我们不需要返回任何值。
如果我们使用了其他数据类型作为返回类型,编译器就会报错。
除了在函数定义中使用void作为返回类型外,我们还可以使用void指针。
void指针是一种通用的指针类型,它可以指向任何类型的数据。
例如,下面是一个使用void指针的函数:void printValue(void *ptr, char type) {switch(type) {case 'i':printf("%d\n", *(int*)ptr);break;case 'f':printf("%f\n", *(float*)ptr);break;case 's':printf("%s\n", (char*)ptr);break;}}在这个函数中,我们使用了void指针作为参数,因为我们不知道指针指向的具体类型。
在函数内部,我们使用了类型转换来获取指针指向的具体类型,并打印出对应的值。
空指针是指向空地址的指针,它不指向任何有效的内存地址。
在C语言中,空指针可以用NULL来表示。
例如,下面是一个使用空指针的函数:void printString(char *str) {if(str == NULL) {printf("NULL\n");} else {printf("%s\n", str);}}在这个函数中,我们使用了空指针来判断字符串是否为空。
void在java中的用法
void在java中的用法Java语言是目前世界上最流行的编程语言之一,而在Java中,void是一个非常重要的关键字,其在程序设计中有着举足轻重的地位。
下面我们就来深入地了解一下void在Java语言中的用法和作用。
1. void的概念void是一种特殊的Java数据类型,它代表“空类型”,也就是说,当一个方法的返回值类型被定义为void时,这个方法将不会返回任何数据类型的值。
void关键字的作用是告诉编译器这个方法不需要返回任何值。
2. void的用法在Java语言中,void主要用于方法的定义中,一般在方法名前,表示该方法没有返回值。
例如:public void printMessage() {System.out.println("Hello World!");}3. void的作用3.1 节省内存空间由于void类型的方法不需要返回任何值,因此在方法调用过程中就不需要为返回值预留内存空间,节省了内存的使用。
3.2 避免出错在方法调用的过程中,如果不需要返回值,却定义了返回值类型,那么在方法调用时就很容易出现错误。
而使用void关键字,可以避免这种错误的发生,提高程序的健壮性和代码的可读性。
3.3 程序的简洁在Java程序中,一旦方法的返回类型被定义为void,那么这个方法就不需要执行return语句来返回值,使得程序更加简洁、易于维护。
4. void的限制虽然使用void在Java程序设计中有很多好处,但有些时候也会带来一些限制。
例如:4.1 不能作为变量类型由于void类型表示没有任何值,所以它不能作为变量类型使用。
4.2 不能作为表达式结果void类型不能作为表达式的结果类型。
例如,下面的代码就是错误的:String result = void;5. 总结在Java程序设计中,void关键字是一个非常重要的概念,它用于定义没有返回值的方法。
使用void可以节省内存空间,避免出错,使程序更加简洁。
void函数的作用(一)
void函数的作用(一)Void函数的作用什么是Void函数?Void函数,也称为无返回值函数,是一种在编程中常用的函数类型。
与有返回值函数不同,Void函数执行完毕后不会返回任何值。
Void函数的作用以下列点的方式介绍Void函数的作用:1.实现任务:Void函数可以包含一系列的代码,用于执行特定的任务。
这些任务可能包括打印信息、修改变量的值、调用其他函数等等。
2.减少重复性代码:当我们在程序中有多个地方需要执行相同的代码块时,可以将这些代码封装成一个Void函数,然后在需要的地方调用该函数。
这样可以减少代码重复,提高代码的可维护性。
3.提高程序结构化:使用Void函数可以将程序分成不同的模块,每个模块负责一个特定的任务。
这样可以使程序更加清晰、易于理解和调试。
4.简化程序逻辑:通过使用Void函数,可以将复杂的程序逻辑拆分成多个简单的函数。
这样每个函数只需关注自己的任务,使代码更加简洁和易于维护。
5.提高代码的可复用性:Void函数可以在不同的程序中重复使用,提高代码的可复用性。
当我们需要执行相同的任务时,只需调用该函数即可。
6.便于团队合作:在团队开发中,使用Void函数可以使团队成员更容易理解和维护代码。
不同的成员可以负责不同的函数,提高工作效率。
总结Void函数在编程中具有重要的作用,它可以实现特定的任务、减少代码重复、提高程序的结构化和简化逻辑。
通过合理地使用Void函数,可以使我们的代码更加可读、可维护和可复用。
无论是个人开发还是团队合作,我们都应该充分发挥Void函数的作用,提高编程效率。
Void函数的注意事项在使用Void函数时,我们需要注意以下几点:1.函数命名:函数的名称应该具有描述性,能够清晰地表达函数的作用。
命名应该使用驼峰命名法或下划线命名法,并且要遵循编程的命名规范。
2.函数参数:如果函数需要接收参数,需要在函数声明时定义参数的类型和名称。
参数的选择要符合函数的作用,避免冗余或过于复杂的参数。
void空类型的用法
void空类型的用法Void空类型的用法Void空类型常常被用在编程语言中,尤其是在C、C++、Java等程序开发语言中。
Void本身可以被视为一种特殊的数据类型,它有着非常重要的用途。
在不同的应用场景中,Void空类型的用法也不尽相同。
接下来,我们将按照不同的类别来介绍Void空类型的用法。
1.函数返回值类型在C和C++中,函数可以返回不同类型的值,但有些函数返回值是“无”,因为它们仅仅执行一些任务而不直接返回任何值。
这时候我们就需要用到Void空类型了。
例如,一个打印出信息的函数并不需要返回任何数据。
在这种情况下,就可以定义函数类型为Void。
例如:void printMessage(){printf("Hello World!\n");}2.函数参数类型Void空类型同样可以用作函数参数类型。
有些函数不需要参数进行处理,但是为了能够通过编译器编译,我们必须向函数传递正确的参数类型。
这时候就可以使用Void空类型,在此函数中,我们可以通过Void空类型将参数直接传递给函数。
例如:void display(void){printf("This is display function\n");}3.指针类型指针是指向内存地址的变量,它所存储的是一个内存中的物理地址,而这个地址引用了另一个变量的值。
为什么会在这里提到指针呢?因为在定义指针的时候,如果没有准确的类型,则可以使用Void空类型。
例如:void *ptr = NULL;4.内存分配类型在C和C++中,有时候我们需要动态地分配内存,然而有些时候我们无法确定分配的内存应该是什么类型的。
这个时候,就可以使用Void空类型。
例如:void *p;p = malloc(50);5.结构定义类型在C中,有时我们需要在同一个结构体中存储不同数据类型。
这个时候,可以使用Void空类型定义该结构体,使不同数据类型的变量同时存在于该结构体中。
java void用法
Java中的void用法介绍在Java编程中,void是一种特殊的数据类型,表示不返回任何值的方法。
当一个方法被声明为void时,它表示该方法不会返回任何值给调用者。
在本文中,我们将探讨Java中void的用法,包括方法的声明、调用、返回类型和使用注意事项。
方法声明和调用声明方法为void类型在Java中,当我们声明一个方法时,需要指定其返回类型。
如果方法不返回任何值,则应将返回类型声明为void。
public void methodName() {// 方法体}调用void方法要调用一个void方法,可以直接使用方法名加上括号来调用。
methodName();void方法的特点void方法在Java中有以下几个特点: 1. 无返回值:void方法不返回任何值。
它们被设计用于执行一些特定的操作而不是返回结果。
2. 没有return语句:在void方法中,不需要使用return语句来返回值。
因为void方法没有返回值,所以没有必要使用return语句。
3. 可以有参数:void方法可以有参数,用于接收输入值。
参数可以在方法内部使用。
4. 可以有副作用:void方法通常用于执行一些带有副作用的操作,如修改对象的状态、打印输出等。
使用void方法的注意事项在使用void方法时,我们需要注意以下几点: 1. 不能将void方法的返回值赋给任何变量或使用它进行任何计算。
2. void方法不能作为条件表达式使用,因为它没有返回值。
3. void方法通常用于执行一些操作而不返回结果,如果需要从方法中获取结果,应该选择其他的返回类型。
示例代码下面是一个简单的示例代码,展示了如何声明和使用void方法。
public class VoidExample {public static void main(String[] args) {printHelloWorld();}public static void printHelloWorld() {System.out.println("Hello, World!");}}在上述示例中,我们声明了一个名为printHelloWorld的void方法,该方法用于打印”Hello, World!“。
在c语言中void的作用
在c语言中void的作用在C语言中,void是一种特殊的数据类型,它用来表示无返回值或者无参数的函数。
首先,void用于表示一个函数没有返回值。
在C语言中,函数可以有返回值也可以没有返回值。
当一个函数不需要返回结果给调用它的地方时,可以使用void关键字来声明该函数。
例如,一个用于打印输出的函数可以声明为void类型,因为它不需要返回任何结果给调用者。
其次,void还可以用来表示函数没有任何参数。
在C语言中,函数可以接受参数也可以不接受参数。
当一个函数不需要接受任何参数时,可以使用void关键字来声明该函数。
例如,一个简单的打印欢迎信息的函数可以声明为void类型,因为它不需要任何输入参数。
另外,在函数声明中,void也可以用来表示函数的参数列表可以为空。
在C语言中,函数可以带有任意数量的参数。
当一个函数可以没有任何参数时,可以使用void关键字表示函数不带有参数。
例如,一个用于计算两个整数相加的函数声明可以是`int add(int a, int b)`,如果不需要接受任何参数,可以通过`int add(void)`来声明。
需要注意的是,void关键字本身并不占用内存空间,因为它表示的是一个空类型或者无效类型。
因此,void类型的变量是不允许存在的。
如果需要使用无效类型的指针,可以声明一个void指针`void 某`来表示通用指针,这个指针可以指向任意类型的数据,但在使用时需要进行类型转换。
此外,void还可以用在类型的前面作为修饰符,表示无类型。
例如,`void 某ptr`表示一个指向未知类型的指针。
综上所述,void在C语言中的作用是用来表示无返回值的函数、没有参数的函数以及空参数列表的函数。
它是一种特殊的数据类型,用来表示空类型或者无效类型。
C语言中void有什么作用
C语言中void有什么作用C语言中void有什么作用void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
那么C语言中void具体有什么作用呢?一起来学习下吧:1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1) 对函数返回的限定;(2) 对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float *p1;int *p2;p1 = p2;其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void *p1;int *p2;p1 = p2;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
c语言中void的作用
c语言中void的作用c语言中,void的意思是“无类型”,相应的“void ”为无类型指针,常用在程序编写中对定义函数的参数类型、返回值函数中指针类型进行声明,其作用是对函数返回和参数的进行限定voidvoid最常见的用法,就是在函数中限定函数的参数和返回值的void draw(void):表明函数draw没有参数也没有返回值,void在别的的地方的应用我也没见过实际上,如果把void 和in,char,double类型放到一起理解的话,首先还是那向揭示本质的话,变量类型就是固定大小内存块的别名那么void占用多大内存呢,编译器并没有定义void占用多大内存,所以对于void var; 这样的定义,编译器自然是不允许的,在vs中的错误提示是: 不允许使用不完整的类型。
void相比于void.void *就更加有意义一些,void "是一个指针类型,指针变量都占4byte内存(4byte=32 bit=2^32=4G,所以4byte就足以指向任何的内存地址了),所以对于void p=NULL:这样的定义,编译器可以为p分配内存,那么,如此定义的O有什么作用呢? int *a=NULL p=a;double*b=NULL:p=b;char c[16]=(0);p=c;void*就像一张白纸,任何类型的指针都可以直接赋值给void*类型的指针;但是反过来int*a=NULL;a=p;//erra=(int*)p;//需要强制类型转换这样转过来转过去有何意义?典型应用void * memcpy(void *dest, const void *src, size t len).void * memsetQ ( void * buffer. int c. size t num ).memcpy和memset对外接收任何类型的指针,这样是合理并且必要的,因为这是内存操作函数,是对bit进行操作作的,考虑教据类型是没有任何意义的(越触及本质,越抽象,也越有包容性)。
C语言void及void指针
C/C++语言void及void指针1.void的含义void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:这行语句编译时会出错,提示“illegal use of type'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:其中p1=p2语句会编译出错,提示“'=':cannot convert from'int*'to'float*'”,必须改为:而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:提示“'=':cannot convert from'void*'to'int*'”。
2.void的使用下面给出void关键字的使用规则:规则一如果函数没有返回值,那么应声明为void类型在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
但是许多程序员却误以为其为void类型。
例如:程序运行的结果为输出:2+3=5这说明不加返回值说明的函数的确为int函数。
void函数调用格式c语言 -回复
void函数调用格式c语言-回复关于void函数调用格式的C语言问题,我将为您详细解答。
在C语言中,void是一种特殊的数据类型,表示空类型。
与其他数据类型不同,void 类型没有任何值,它主要用于函数返回类型和函数参数类型。
在函数调用中,void函数有着特定的调用格式。
首先,让我们先了解一下void函数的概念。
在C语言中,函数是一段可重复使用的代码块,可以完成特定的任务。
void函数是一种没有返回值的函数类型,也就是函数不会给调用者返回任何值。
这种函数通常用于执行一系列的操作或者打印输出结果,而不需要返回任何计算结果。
那么,如何正确地调用一个void函数呢?下面是一步一步的介绍:1. 确定函数的名称和定义:首先,我们需要确定需要调用的void函数的名称,并且在程序的代码中找到该函数的定义。
示例:cvoid printMessage() {函数体printf("Hello, World!\n");}2. 调用函数:一旦确定了函数的名称和定义,我们就可以在程序的任何位置调用void函数了。
在C语言中,通过写下函数名称,加上一对括号"()",来调用函数。
示例:cint main() {调用printMessage函数printMessage();return 0;}3. 函数调用的注意事项:在调用void函数时,需要注意以下几个方面:- 函数调用只需要写下函数名称,不需要写返回类型。
这是因为void 函数没有返回类型。
- 调用void函数时,可以将其视为一个语句,因此需要在函数名称后面加上一个分号。
- 在函数调用过程中,如果该函数有参数,需要在函数名后面的括号中传递相应的参数。
示例:假设我们有一个具有参数的void函数:cvoid printSum(int a, int b) {int sum = a + b;printf("Sum is d\n", sum);}我们可以这样调用它:cint main() {int num1 = 3, num2 = 5;printSum(num1, num2); 调用printSum函数,并传递参数num1和num2return 0;}4. 函数调用结果:调用void函数不会返回任何值,但是它可以执行一些计算或者操作,并且可以在函数内部使用输出函数,如printf(),将结果显示到屏幕上。
void类型详解
void类型详解void的含义void即“⽆类型”,void *则为“⽆类型指针”,可以指向任何数据类型。
void指针使⽤规范①void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值。
例如:int * pint;void *pvoid;pvoid = pint; /* 不过不能 pint= pvoid; */如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint= (int *)pvoid;②在ANSIC标准中,不允许对void指针进⾏算术运算如pvoid++或pvoid+=1等,⽽在GNU中则允许,因为在缺省情况下,GNU认为void *与char *⼀样。
sizeof(*pvoid )== sizeof( char).void的作⽤①对函数返回的限定。
②对函数参数的限定。
当函数不需要返回值时,必须使⽤void限定。
例如: void func(int, int);当函数不允许接受参数时,必须使⽤void限定。
例如: int func(void)。
由于void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值,因此还可以⽤void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。
例如:void * memcpy( void *dest, const void *src, size_t len );void * memset( void * buffer, int c, size_t num);------------------------------------------------------------------------------1. 综述许多初学者对C/C++语⾔中的void及void指针类型不甚理解,因此在使⽤上出现了⼀些错误。
本⽂将对void关键字的深刻含义进⾏解说,并详述void及void指针类型的使⽤⽅法与技巧。
void和void的区别
void和void*的区别void 和 void* 的区别2009-10-12 19:51 43人阅读评论(0) 收藏举报转载:/defier555/article/details/4659917 void1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float *p1;int *p2;p1 = p2;其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void *p1;int *p2;p1 = p2;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void目录[隐藏]概述void含义void的使用总结概述void含义void的使用总结[编辑本段]概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
[编辑本段]void含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义,不妨试着定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a 的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float *p1;int *p2;p1 = p2;其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'flo at *'”,必须改为:p1 = (float *)p2;而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void *p1;int *p2;p1 = p2;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:void *p1;int *p2;p2 = p1;提示“'=' : cannot convert from 'void *' to 'int *'”。
[编辑本段]void的使用下面给出void关键字的使用规则:规则一如果函数没有返回值,那么应声明为void类型在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
但是许多程序员却误以为其为void类型。
例如:add ( int a, int b ){return a + b;}int main(int argc, char* argv[]){printf ( "2 + 3 = %d", add ( 2, 3) );}程序运行的结果为输出:2 +3 = 5这说明不加返回值说明的函数的确为int函数。
林锐博士《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。
可是编译器并不一定这么认定,譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。
因此,为了避免混乱,在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。
如果函数没有返回值,一定要声明为void类型。
这既是程序良好可读性的需要,也是编程规范性的要求。
另外,加上void类型声明后,也可以发挥代码的“自注释”作用。
代码的“自注释”即代码能自己注释自己。
规则二如果函数无参数,那么应声明其参数为void。
在C++语言中声明一个这样的函数:int function(void){return 1;}则进行下面的调用是不合法的:function(2);因为在C++中,函数参数为void的意思是这个函数不接受任何参数。
在Turbo C 2.0中编译:#include "stdio.h"fun(){return 1;}main(){printf("%d",fun(2));getchar();}编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。
在C++中,不能向无参数的函数传送任何参数,出错提示“'fun' : function does not take 1 parameters”。
所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。
规则三小心使用void指针类型按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:void * pvoid;pvoid++; //ANSI:错误pvoid += 1; //ANSI:错误//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
//例如:int *pint;pint++; //ANSI:正确pint++的结果是使其增大sizeof(int)。
( 在VC6.0上测试是sizeof(int)的倍数) 但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。
因此下列语句在GNU编译器中皆正确:pvoid++; //GNU:正确pvoid += 1; //GNU:正确pvoid++的执行结果是其增大了1。
( 在VC6.0上测试是sizeof(int)的倍数)在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:void * pvoid;(char *)pvoid++; //ANSI:正确;GNU:正确(char *)pvoid += 1; //ANSI:错误;GNU:正确GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。
但是我们在真实设计时,还是应该尽可能地迎合ANSI标准。
规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void *典型的如内存操作函数memcpy和memset的函数原型分别为:void * memcpy(void *dest, const void *src, size_t len);void * memset ( void * buffer, int c, size_t num );这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
如果memcpy和memset的参数类型不是void *,而是char *,那才叫真的奇怪了!这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的”函数!下面的代码执行正确://示例:memset接受任意类型指针int intarray[100];memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0//示例:memcpy接受任意类型指针int intarray1[100], intarray2[100];memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarr ay1有趣的是,memcpy和memset函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!规则五void不能代表一个真实的变量下面代码都企图让void代表一个真实的变量,因此都是错误的代码:void a; //错误function(void a); //错误void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。
正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。
[编辑本段]总结小小的void蕴藏着很丰富的设计哲学,作为一名程序设计人员,对问题进行深一个层次的思考必然使我们受益匪浅。
不论什么类型的指针(void*, char*, int*, float*...) 默认初始值都是0xCCCCCC CC#include<iostream.h>#include <memory.h>//#include <string.h>void main(){void *p1;int a = 10;int *p2 = &a;cout << p1 << endl;cout << (int)*p2 << endl;p1 = p2;cout << *(int*)p1 << endl;//!!!!!!! 用空类型操作输出值!cout << (int)*p2 << endl;}/* 输出:0xCCCCCCCC101010*/在声明同时赋值NULL,在delete后立即设置为NULL。
在debug版本下指针默认初始值为0xCCCCCCCC,在Release版本下初始值为0x0000000A,(在我电脑上VC6.0)。
对于指针如果暂时没有合适的初始化值,就应该把它置为NULL(0)。
对于好的编程习惯来说,declare一个指针,则初始化为NULL,如果是类成员则在构造函数中initialize,当对指针使用delete时候,则置它为NULL。
0xCCCCCCCC只是在debug状态下VC生成的未定义过的指针值,用来提示这个指针是未被初始化的,在release状态下不会等于这个值(除非巧合)。
对于指针如果暂时没有合适的初始化值,就应该把它置为NULL。