分类: 嵌入式
2016-08-13 09:26:53
C语言中的void和void *是一个经常被忽略的知识点,这里对它们的用法进行总结
1 void的作用
C语言中,void意为“不确定类型”, 不可以用void来声明变量(例如,void a = 33;编译时编译器会报错,Error:variable or field ‘a’ declared void),void通常用于对函数的限定:
(1)对函数返回的限定,当函数不需要返回值值时,必须使用void限定,例如:void func(int a,char *b)。
(2)对函数参数的限定,当函数不允许接受参数时,必须使用void限定,例如:int func(void)。
2 void * 的作用
C语言中,void *意为“不确定类型指针”,不确定的含义是指使用void*声明指针时,指针的类型不确定,在后续使用该指针时,需要通过强制类型转换将该指针转为所需要的类型。例如
输出结果
可见,在GNU C中,允许void指针进行算术运算,如p++或p+=1等,因为在缺省情况下,GNU 认为void *和char *一样,这里sizeof(*p)==sizeof(char)。
在ANSI C中,则不允许对void *指针进行算术运算,如p++或p+=1等,因为char型操作sizeof(char)字节,int型操作sizeof(int)字节,而void型则不知道操作几个字节。
可见, GNU较ANSI更“开放”,提供了更多语法的支持。但在实际应用时,还是应该尽可能地迎合ANSI标准。
3 void在C语言库函数中的应用
void *指针可以指向任意类型的数据,在程序设计时会带来便利,例如函数形参为指针类型时,可以将其定义为void *指针,这样在调用函数传参时,就可以给其传递任意类型的指针,如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy ( void *dest, const void *src, size_t n );
void * memset ( void *s, int c, size_t n );
这样,任何类型的指针都可以传入memcpy和memset中,真实体现了内存操作函数的意义:函数操作对象仅是内存存储单元,而不论这片内存是什么类型(参见C语言实现泛型编程)。
使用void *指针的另一个实例:malloc函数返回的指针就是void *型,在使用这个指针时,要进行强制类型转换,需要显式说明该指针指向的内存是存放的什么类型的数据,如(int *)malloc(1024)表示将malloc返回的void*指针指向的内存中存放的数据类型强制转换位int型。