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