C语言学习之void关键字

目录

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

  • 123
    点赞
  • 345
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值