目录
1.void的理解
2.void修饰变量
3.void修饰函数
1.void作为函数返回值
2.返回类型缺省的函数
3.void作为函数参数
4.总结
4.void型指针
1.void*的理解
2.void*的使用
3.总结
1.void的理解
void是C语言中的一种数据类型,其表示空类型,其所占的空间往往是不明确的。如在VS中void类型占0个字节,在Linux系统中void类型占1个字节。相应的“void *”为无类型指针,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,其作用是对函数返回和参数的进行限定。
2.void修饰变量
我们来看下面一段代码:
#include<stdio.h> int main() { void a = 10; return 0; }
讯享网

我们可以发现,以上代码是无法通过编译的,编译器提示我们不能用void来定义变量a,因此我们可以得到以下结论:
定义变量的本质是开辟空间
1.void本身就被编译器解释为空类型,强制地不允许定义变量;
2.void类型的空间不明确,理论上无法开辟空间,即使开了空间,也仅仅作为一个占位符,因此无法定义变量。
3.void修饰函数
1.void作为函数返回值
在C语言中,函数可以分为两种类型,有返回值和无返回值。我们把void修饰的函数作为无返回值的函数,把特点数据类型修饰的函数作为有返回值的函数,如下:

讯享网#include<stdio.h> int text02() //有返回值 { printf("text02"); return 1; } void text01() //无返回值 { printf("text01"); } int main() { text01(); int a=text02(); return 0; }
此时如果用一个变量来接收text01()的返回值,编译器将会报错。
2.返回类型缺省的函数
在C语言中,一个函数其实是可以不带任何返回值类型的,如下:
#include<stdio.h> text01() //没有返回类型 { printf("text01"); return 1; } int main() { text01(); return 0; }
此时编译器并未报任何错误和警告,因为C语言语法规定,当一个函数没有返回类型时,默认返回int类型。例如,将返回值改为double类型,编译器则会报警:
讯享网#include<stdio.h> text01() //没有返回类型 { printf("text01"); return 1.0; } int main() { text01(); return 0; }
3.void作为函数参数
我们来看以下代码:
#include<stdio.h> int text02() { printf("text02\n"); return 1; } int text03(void) { printf("text03\n"); return 1; } int main() { text02(); text02(1); //不会报警 text03(); text03(1); //报警 return 0; }
我们可以发现,对于text02()函数,参数列表没有任何参数,当我们调用这个函数时即便传了参数编译器也不会报出任何警告,只是传入的参数不会用到;而对于text03() 函数就不同,当传入参数时,编译器就会报出警告(有些编译器会进行报错),表明不能对函数进行传参。

4.总结
1.如果函数没有返回值要声明为void类型,提高代码可读性,避免混淆
2.如果函数没有参数,则应声明参数为void类型,更加严谨
4.void型指针
1.void*的理解
void*表示一个指向void类型的指针,指针变量所占的字节空间与所指向的类型没有关系,取决于使用系统的位数。因此我们可以定义一个空指针变量并对其赋值,如下:
#include<stdio.h> int main() { int a = 10; void* p = &a; //正确的,&a与p所占空间相同 int* p2 = p; //正确的,p与p2所占空间相同 return 0; }
2.void*的使用
需要注意的是,在使用void*指针进行一些加,减,解引用等操作时,需要先将其强制类型转换为特定的数据类型,否则就会报错,如下:
#include<stdio.h> int main() { int a = 10; void* p = &a; p = p + 1; //p向后移动 p = p - 1; //p向前移动 printf("%d", *p); //取出p指向内容 return 0; }

1.由于p指向的类型为void类型,p + 1和p - 1代表向前/后移动一个特定类型的步长,而void类型的大小不明确,因此没有意义。
2.p指向的类型为void类型,因此在解引用的时候就是以void类型来解释指向地址的数据,与用void定义变量相同,编译器会强制报错。
正确的使用方法如下:
#include<stdio.h> int main() { int a = 10; void* p = &a; p = ((int*)p + 1); //强转为int*,向后移动一个整形的空间 p = ((int*)p - 1); //强转为int*,向前移动一个整形的空间 printf("%d", *(int*)p); //强转为int*,以int类型来解释数据 return 0; }
由于向后一个整形、向前一个整形互相抵消,所以p最后存储的值还是a的地址,最后对p进行解引用得到的整形数据即为a的值。
3.总结
1.void*可以被任何类型的指针接收,void*也可以接收任何类型的指针。 因此void*也可以称为万能指针。
2.对void指针进行算数运算或对其内容进行操作时,需先将其强制类型转换为特定的数据类型。
以上,就是本期的全部内容。
制作不易,能否点个赞再走呢qwq

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/17955.html