深入理解C语言-深入理解void

void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据

void含义

void几乎只有注释和限制程序的作用,定义一个void变量没有意义
void的真正作用在于

  1. 对函数返回的限定
  2. 对函数参数的限定
    在C语言中,void *可以接受任意类型指针的赋值,而不需要进行内存强制转换
void *p1;
int *p2;
p1 = p2;

但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为无类型可以包容有类型,而有类型则不能包容无类型。以下语句在编译时候就会报错

void *p1;
int *p2;
p2 = p1;

void的理解

如果函数没有返回值,那么应声明为void类型

在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回int类型值处理
但在实际编程中,为了代码的可阅读和可维护,无返回值的时候要加上void

如果函数无参数,那么应声明其参数为void

虽然很多时候,在函数没有参数的时候,需要加上void
在C有的编译器中,如果不添加void,那么此函数会接受任意类型参数
所以,在函数不接受任何参数的时候要用void进行说明

小心使用void指针类型

在不同的C标准中,处理void指针的算法操作有着不一样的宽容度
ANSI认为,一切对void指针的运算操作都是非法的,会报错
而GNU则认为,void指针的算法操作和char *保持一致
为何兼容二者的思想,一般会对void指针进行转化,然后再对其操作

void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确

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

典型的如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型
这两个函数的返回值也是void *

void不能代表一个真实的变量

void代表了一种抽象,而不是实实在在存在的变量
因此,不能定义一个void变量

void的使用

数据类型的封装

int InitHardEnv(void **handle);

典型的如内存操作函数memcpy和memset的函数原型分别为

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );  

void修饰函数返回值和参数,仅表示无

如果函数没有返回值,那么应该将其声明为void型
如果函数没有参数,应该声明其参数为void

int function(void)
{
    return 1;
}

void指针的意义

C语言规定只有相同类型的指针才可以相互赋值
void*指针作为左值用于接收任意类型的指针
void*指针作为右值赋值给其它指针时需要强制类型转换

int *p1 = NULL;
Char *p2 = (char *)malloc(sizoeof(char) * 20); 

不存在void类型的变量

C语言没有定义void究竟是多大内存的别名

原文地址:https://www.cnblogs.com/cj5785/p/10664772.html