void类型详解

void类型详解
void类型详解

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

#include

//#include

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;

}

/* 输出:

0xCCCCCCCC

10

10

10

*/

在声明同时赋值NULL,在delete后立即设置为NULL。

在debug版本下指针默认初始值为0xCCCCCCCC,在Release版本下初始值为0x0000000A,(在我电脑上VC6.0)。对于指针如果暂时没有合适的初始化值,就应该把它置为NULL(0)。

对于好的编程习惯来说,declare一个指针,则初始化为NULL,如果是类成员则在构造函数中initialize,当对指针使用delete时候,则置它为NULL。

0xCCCCCCCC只是在debug状态下VC生成的未定义过的指针值,用来提示这个指针是未被初始化的,在release状态下不会等于这个值(除非巧合)。对于指针如果暂时没有合适的初始化值,就应该把它置为NULL

void类型详解

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函数。

NULL,void的区别

一般把(void*)0定义为NULL 表示这是个空指针 void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的 数据。 众所周知,如果指针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 *p1; int *p2; p2 = p1; 提示“'=' : cannot convert from 'void *' to 'int *'”。 在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函数。

CC++语言中void及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 *p1; int *p2; p2 = p1; 提示“'=' : cannot convert from 'void *' to 'int *'”。 3.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) ); }

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函数。 林锐博士《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。可是编译器并不一定这么认定,譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。 因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。 规则二如果函数无参数,那么应声明其参数为void

void指针小结

C/C++语言void及void指针深层探索 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.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 *'”。 3.void的使用

标识符的含义

标识符的含义 标识符也称为名字,可以指代多种实体:函数、结构标记、联合标记和枚举标记;结构 成员或联合成员;枚举常量;类型定义名;标号以及对象等。对象有时也称为变量,它是一个存储位置。对它的解释依赖于两个主要属性:存储类和类型。存储类决定了与该标识对象相关联的存储区域的生存期,类型决定了标识对象中值的含义。名字还具有一个作用域和一个连接。作用域即程序中可以访问此名字的区域,连接决定另一作用域中的同一个名字是否指向同一个对象或函数。作用域和连接将在A.11 节中讨论。 A.4.1 存储类 存储类分为两类:自动存储类(automatic)和静态存储类(static)。声明对象时使用的一些关键字和声明的上下文共同决定了对象的存储类。自动存储类对象对于一个程序块(参见A.9.3 节)来说是局部的,在退出程序块时该对象将消失。如果没有使用存储类说明符,或者 如果使用了auto限定符,则程序块中的声明生成的都是自动存储类对象。声明为register 的对象也是自动存储类对象,并且将被存储在机器的快速寄存器中(如果可能的话)。 静态对象可以是某个程序块的局部对象,也可以是所有程序块的外部对象。无论是哪一 种情况,在退出和再进入函数或程序块时其值将保持不变。在一个程序块(包括提供函数代码的程序块)内,静态对象用关键字static 声明。在所有程序块外部声明且与函数定义在 同一级的对象总是静态的。可以通过static 关键字将对象声明为某个特定翻译单元的局部 对象,这种类型的对象将具有内部连接。当省略显式的存储类或通过关键字extern 进行声 明时,对象对整个程序来说是全局可访问的,并且具有外部连接。 A.4.2 基本类型 基本类型包括多种。附录B 中描述的标准头文件中定义了本地实现中每种 类型的最大值和最小值。附录B给出的数值表示最小的可接受限度。 声明为字符(char)的对象要大到足以存储执行字符集中的任何字符。如果字符集中的 某个字符存储在一个char类型的对象中,则该对象的值等于字符的整型编码值,并且是非负 值。其它类型的对象也可以存储在char类型的变量中,但其取值范围,特别是其值是否带符 号,同具体的实现有关。 以unsigned char 声明的无符号字符与普通字符占用同样大小的空间,但其值总是非 负的。以signed char显式声明的带符号字符与普通字符也占用同样大小的空间。 说明:本书的第1 版中没有unsigned char 类型,但这种用法很常见。signed char 是新 增加的。 除char 类型外,还有3 种不同大小的整型类型:short int、int 和long int。普 通int 对象的长度与由宿主机器的体系结构决定的自然长度相同。其它类型的整型可以满足 各种特殊的用途。较长的整数至少要占有与较短整数一样的存储空间;但是具体的实现可以使得一般整型(int)与短整型(short int)或长整型(long int)具有同样的大小。

将0转型为“指向返回值为void的函数的指针” (void (x)())0

(void (*)())0 的含义 (void (*)())0 的含义: 1. fp是一个指针{有*},她指向返回值为void{有(void)}类型的函数{有()}:void (*fp)(); 调用方式简写为:(*fp)(); 2. 制作其对应的类型强制转换符:void (*)() 3. 存储位置为0 的强制转换为一个指向返回值为void类型的函数的指针:(void (*)())0 4. 用上式代替fp,从而实现调用存储位置为0的子例程:(*(void(*)())0)(); 5. 利用typedef简化:typedef void (*funcptr)(); (*(funcptr)0)(); (void (*)())0 的含义:实际上就是将地址0强制转换为一个指向返回值为void类型的函数的指针。 下面将相关基础知识进行介绍,其中参考了网上一些文章,名单不再列出,谢谢各位大虾的贡献: 1、c语言的声明 2、类型转换符的制作 3、signal函数分析 4、typedef用法 5、const用法 6、typedef的好处 1 C语言的声明 声明由两部分组成:类型以及声明符: float f,g; float ((f));//对其求值时,((f))的类型为浮点型,可以推知,f也是浮点型 float *g(),(*h)();//g是函数,该函数的返回类型为指向浮点数的指针 //h是个指针,且是一个函数指针,该指针指向函数返回值,该返回值是一个float型 (*fp)()简写为fp()//函数调用方式,其中fp为函数指针 *((*fp)())简写为*fp()//函数返回值为某个类型的指针 、2 类型转换符制作 类型转换符制作: 1、去掉声明中的变量名、分号; 2、将剩余部分用括号"封装"起来 float (*h)(); --> (float (*)())//指向返回值为float型的函数指针的类型转换符(*0)();//返回值为void类型的函数指针 如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为 void,fp的声明如下:void (*fp)(); 因此可以用下式完成调用存储位置为0的子例程:void (*fp)(); (*fp)(); 这种写法的代价是多声明了一个哑变量,我们常将0转型为“指向返回值为void的函数的指针”:(void (*)())0 用上式代替fp,从而得到:(*(void(*)())0)(); typedef void (*funcptr)(); 将0转型为“指向返回值为void的函数的指针”-----(void (*)())0 (*(funcptr)0)(); 3 signal函数

void详解

void及void指针含义的深刻解析 void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。 void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如: int *pint; void *pvoid; pvoid = pint; /* 不过不能 pint = pvoid; */ 如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint = (int *)pvoid; ②在ANSI C标准中,不允许对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指 针类型的使用方法与技巧。 2.void的含义

关键字和含义

仅当abstract类的子类实现其超类的所有abstract方法时,才能实例化abstract类的子类。这种类称为具体类,以区别于abstract类。 如果abstract类的子类没有实现其超类的所有abstract方法,该子类也是abstract类。 abstract关键字不能应用于static、private或final方法,因为这些方法不能被重写,因此,不能在子类中实现。 final类的方法都不能是abstract,因为final类不能有子类。 boolean boolean变量的值可以是true或false。 -示例- boolean valid=true; if(valid){ } -注释- boolean变量只能以true或false作为值。 boolean不能与数字类型相互转换。 包含boolean操作数的表达式只能包含boolean操作数。 Boolean类是boolean原始类型的包装对象类。 break 用于提前退出for、while或do循环,或者在switch语句中用来结束case块。 -示例- for(i=0;i){ break;}} inttype=; switch(type){ case1: break; case2: break; default: } -注释- break总是退出最深层的while、for、do或switch语句。 byte byte是Java原始类型。 byte可存储在[-128,127]范围以内的整数值。

c语言void与NULL完全解析

c语言void与NULL完全解析 作者:朱有鹏 1、void类型的本质 现在编程语言分2种:强类型语言和弱类型语言。强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。C语言就是典型的强类型语言,C语言中所有的变量都有明确的类型。因为C语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存的解析方法。 数据类型决定了变量占用的空间大小和内存的解析方法。所以C语言中变量必须有确定的数据类型,如果一个变量没有确定的类型(就是所谓的无类型)会导致编译器无法给这个变量分配内存,也无法解析这个变量对应的内存。因此不可能有没有类型的变量,但是C语言中可以有没有类型的内存。在内存还没有和具体的变量相绑定之前,内存就可以没有类型。实际上纯粹的内存就是没有类型的,内存只是因为和具体的变量相关联后才有了确定的类型(其实内存自己本身是不知道的,而编译器知道,我们程序在使用这个内存时知道类型所以会按照类型的含义去进行内存的读和写)。 void类型的字面上的含义是:不知道类型,不确定类型,或者说还没确定类型,很多初学者把它理解成空的,这是不对的。我们以void a为例,void a定义了一个void类型的变量,含义就是说a是一个变量,而且a肯定有确定的类型,只是目前我还不知道a的类型,所以标记为void类型。在C语言中如果我们去定义一个void a;a=5;去执行它必然出错,因为a还没确定具体数据类型,我们无法给它分配内存空间,故而出错。 那我们什么情况下需要void类型呢?其实就是在描述一段还没有具体使用的内存时需要使用void类型。典型应用案例就是malloc的返回值。malloc()函数的原型是void*malloc(size_t size);malloc函数向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存。malloc刚申请的这段内存尚未用来存储数据,malloc函数也无法预知这段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,故而返回一个void*类型,告诉外部我返回的是一段干净的内存空间,但尚未确定类型。所以当我们在malloc之后可以给这段内存读写任意类型的数据。 void*类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强制类型转换强行将其转为各种类型。这就是void类型的最终归宿-被强制类型转换成一个具体类型。 现在我们来看程序8.3 #include #include int main(void) { int*p=(int*)malloc(sizeof(int));//由void*强制转为

a href=# 与 a href=javascriptvoid(0) 的区别

a href="#" 与a href="javascriptvoid(0)" 的区别 ... a href="#" 与a href="javascript:void(0)" 的区别"#"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首,而javascript:void(0) 则不是如此 所以调用脚本的时候最好用void(0) 或者<input onclick> <div onclick>等 打开新窗口链接的几种办法 1.window.open('url') 2.用自定义函数 <script> function openWin(tag,obj) { obj.target="_blank"; obj.href = "Web/Substation/Substation.aspx?stationno="+tag; obj.click();

} </script> <a href="javascript:void(0)" onclick="openWin(3,this)">LINK_TEST</a> window.location.href=""------------------------------------------------------------------------------- 如果是个# ,就会出现跳到顶部的情况,个人收藏的几种解决方法: 1:<a href="####"></a> 2:<a href="javascript:void(0)"></a> 3:<a href="javascript:void(null)"></a> 4:<a href="#" onclick="return false"></a> 5:<span style="cursor:hand"></span>(好像在FF 中不能显示) ------------------------------------------------------------------------------- 慎用JavaScript:void(0) 今天调试CGI的时候,明明CGI程序已经执行,并且最后结果也是正确的,但是页面就是不刷新。在FireFox2.0下测试,结果却是正常的,IE6却偏偏不刷新!仔细调查了一下,发现cgi页面链接的是<a href="javaScript:void(0)" OnClick="XXX_Func();" ….> only a sample

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 'float *'”,必须改为: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; }

void及void指针总结

C/C++语言中的void及void指针总结 一、void 和void* 含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 对于void,如果定义void a;是会编译出错的(vc6下得到:error C2182: 'a' : illegal use of type 'void',vs08中:error C2182: “a”: 非法使用“void”类型)对于void*,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。 1.void *p1; 2.int *p2; 3.p1 = p2; 这样是正确的,不过不能将int*转换为void* 二、我们在什么地方能用到void和void* 1、对于void,发挥作用的有两个地方:一是对函数返回值的限定,二是对函数参数的限定。下面举例说明: (林锐的《高质量c++编程指南》上有以下3个对void和void*的使用的类似示范,即,如没有参数,一定要写明void;如没有返回值,一定标注;如果函数参数可以为任意类型指针,声明函数参数为void*) 1)对于返回值的限定 1.#include "stdio.h" 2.add ( int a, int b ) 3.{ 4.return a + b; 5.} 6.int main(int argc, char* argv[]) 7.{ 8. printf ( "2 + 3 = %d \n ", add ( 2, 3) ); 9.return 0; 10.} 上述程序,在C语言中运行是没有任何问题的,因为c语言中,函数如果没有返回值限定,则编译器默认返回为int来处理。虽然看起来会以为返回void。 但是在c++中,类似代码:

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指针类型的使用方法与技巧。 2.void的含义 void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。void 几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a; 这行语句编译时会出错,提示“illegal use of type’void’”。不过,即使voida的编译不会出错,它也没有任何实际意义。void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。例如: float * p1; in t* p2; p1 = p2; 其中p1 = p2语句会编译出错,提示“’=’:cannotconvertfrom’int *’to’float *’”,必须改为: p1=(float*)p2;而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: void * p1; int * p2; p1 = p2; 但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,

C语言void及void指针深层探索

C语言void及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 *p1; int *p2; p2 = p1; 提示“'=' : cannot convert from 'void *' to 'int *'”。 3,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) ); } 程式运行的结果为输出:

c#void的用法

c#void的用法 void这个关键字我老搞不明白不知道怎么用。不知道什么时候需要用它很是郁闷void声明的方法可以有参数吗比如public void Astring names这样可以不public void int Aint age呵呵请指正一下啊。。我就是不知道怎么用啊什么时候需要参数什么时候不需要参数反正我脑子是乱的如果说不清楚请发个参考资料有网址也好啊要个人介绍的那种MSDN的我没搞明白。。谢谢了。。。强烈的谢谢了-----------------------public void Astring names是可以的public void int Aint age不行public int Aint age又可以跟括号里的参数无关方法名前面的voidint是方法返回的类型每个方法都有一个返回类型void是一个比较特殊的东西你可以叫它空类型它表示你的方法不需要返回值而其他的比如public int Aint age这样的方法表示在A方法里面必须返回一个int类型的值必须有return语句而且return对象类型必须是int类型举例public int Aint age age1return age这个方法返回类型是int它最后返回了一个ageage是int类型的而对于void类型的方法public void Aint age age1或public void Aint age age1return都是可以的后一个虽然有return语句但是他没有return任何对象所以是可以的而return任何其他类型都不对。应该很容易理解吧----------------------------这么说吧你要写一个方法A执行某些代码。首先你要一对花括号“”告诉电脑那些代码在哪。就出现如下写法A代码...你方法A想公开在整个程序的任意一个角落都可以使用那就需要加修饰符来说明public A 代码...当然你也可以不加修饰符那程序会默认你加的是private也就是说以下两种写法效果相同A代码...private A代码...然后你的方法可能需要传入一个或多个数参数或者什么数也不需要传入那就需要一对圆括号Aint a代码...A代码...注意你可以不写参数就像上面那么空着但你必须要加上圆括号告诉电脑你的参数是空着的。最后方法可能会返回一个数或一个字母返回值也可能什么也不返回但返回的话个数肯定是一个电脑唯一不知道的就是这一个是什么数还是字母所以你要写上返回值的类型注意对应返回值只有一个的特点返回值类型也只能写一个。int Aint a代码...char Aint a代码...然后就出现你说的这种问题如果方法仅仅执行了一些操作例如在屏幕上显示一行字就结束了没有需要返回的值。但从编译原理上来说方法肯定会返回一个数字哪怕是任意一个数字所以你必须给这个返回的数字规定一个类型。这也就是void出现的原因。它作为一种特殊的类型修饰符存在代表什么也不是的量。其地位应该是与int char...相等的。所以你这样写是错的你要明确的告诉电脑你方法A返回的值是int量还是void量不能同时写两个。当然如果是void就代表返回的值无意义不可以被任何代码接收并使用。public void int Aint age------------------------------------void标明的方法是指这个方法不返回任何东西包括值啊引用这些它和传入参数不相干例子:int Mint aint b...//有两个传入参数的方法并且它返回一个int类型的值void Mint abool b...//有两入传入参数的方法并且它没有任何返回这种方法也称为一个过程------------------------------------不返回参数或值的时候都要用void要返回则带返回的类型------------------------------------lz的解释得都很清楚了。。返回的类型就是public int a return int 这个就是带返回的类型public void a这个就是不带返回的类型的------------------------------------简单的解释是如果有回传就不用VOID如果没有回传就必须用VOID------------------------------------不返回参数的用VOID返回参数的用数据类型------------------------------------谢谢各位的帮忙我现在明白了尤其是anliuty说的很好但我还有点要问这两个方法都实现了age1的功能在实际应用中我在什么情况下怎么区分使用那个比如在实际编程中public int Aint age age1return age public void Aint age age1 ------------------------------------什么情况下需要做一个返回值的方法什么情况下做一个不需要返回值的方法------------------------------------这就看你的具体需求了举个例子你在页面上写一个

c语言中符号含义

char 含义:定义一个字符型变量或返回值 用法:定义(声明)一个字符变量或返回值 结构:类型说明符(共两种分别修饰变量和函数)char 未定义变量名; char 函数名([参数表]) {函数体;} 例: char a; char asd; char x=’a’; ————————————————— float 含义:定义小数型变量或返回值(单精度) 用法:定义(声明)一个小数变量或返回值 结构:定义结构(共两种分别修饰变量和函数)float 未定义变量名; float 函数名([参数表]) {函数体;}

例: float a; float asd; float x=1.74; ————————————————— double 含义:定义小数型变量或返回值(双精度) 用法:定义(声明)一个小数变量或返回值 结构:类型说明符(共两种分别修饰变量和函数)double 未定义说明符; double 函数名([参数表]) {函数体;} 例: double a; double asd; double x=1.74; ————————————————— int 含义:定义整数型变量或返回值 用法:定义(声明)一个整数变量或返回值 结构:定义结构(共两种分别修饰变量和函数)int 未定义变量名; int 函数名([参数表]) {函数体;}

例: int a; int asd; int x=2; ————————————————— long、short、unsigned、signed 含义:定义长、短整形,有、无符号整形 用法:放在int前修饰int(也可省去int直接写)可写成组合形式结构:修饰定义(共两种分别修饰变量和函数) [long/short] [unsigned/signed] [int] 未定义变量名; [long/short] [unsigned/signed] [int] 函数-名([参数表]) {函数体;} 例: long int a; short a; unsigned a; signed int a; long unsigned a; short signed a; ————————————————— const 含义:定义一个常量 用法:将一个常规变量设为常量(固定量)不可再修改。 结构:修饰类型说明 const 类型说明符未定义变量名 例: const char a=’S’; const int i=0; const char* p=”How are you”;

相关主题
相关文档
最新文档