void类型及void指针

时间:2022-09-07 13:18:05

void类型及void指针


基于前面的一篇博客模拟实现 memcpy memmove 时用到的void* 指针展开关于 void void* 指针的概述;


1>void 类型

              1.void 相信大家不会陌生,经常定义无返回值的函数是用 void 定义,表示函数无需返回值;
              
void fun(void)
{
         ;
}
             2. void 的字面意思是 “无类型”,  void 可以定义变量 ,但是相信应该没人会去这样定义,因为没有任何人意义,

       并且大多数编译器都会报错。例:
void类型及void指针
.        
3.这里还有一个误区,有些时候程序员会没有写出函数的返回值类型,在C语言中,凡是没有加返回值类型限制的

函数都会被编译器作为返回整形值处理,大多数程序员可能会认为是 void 型;

fun(void)
{
   return 0;
}

.
       在上面这段代码里,fun函数无参数,一般我们都会直接写个 () 里面什么都不会写,作为一个良好的编程习惯,

       一般函数无参,则默认为void;如果函数的参数可以是任意类型的指针,你那么应该声明为 void*;

       这里既可以引出我们接下来要讲的  void*  指针!

        4.void 真正发挥的作用:

                              (1)对函数返回的限定
                              (2)对函数参数的限定

 2>void*指针

               1. 平时我们所熟知的指针类型都 int*  ,char*,而void*可以指向任何类型的数据,包括'\0';这就是实现

               memcpy和memmove时使用void*的原因;void*就是“无类型的指针”;

               2.   平时我们将指针 p1 赋值给 指针 p2 时需要判断指针类型是否一致,否则将会出错,如果不一致则需要强

               制类型转换;例:   

.        

int *p1;
char *p2;
p1 = (int*)p2;

         当然这样的定义指针而不初始化是有问题的,只是为了举例方便,大家自己写的时候要注意野指针的问题;

          而void*则可以随意的接收任何类型的指针,但是其他类型的指针不能随意接收void *的指针,这就是前面说到

的void*是个无类型的的指针,所以它所指向的内容类型是不确定的;

          但是这并不意味其他类型的指针无法接受void * 指针,我们不是还有强制类型转换嘛!


void* fun(void* p,void *q)
{
       char *s1 = (char *)p;
       int *s2 = (int *)q;
}

.           

  “无类型可以包容有类型,而有类型不能包容无类型”,这是引用大牛总结的话,相信我举的例子已经把这句话

诠释了!

             3.关于函数无返回值时定义为void 还需强调一下,其实C语言有很严格的类型检查,不会允许函数不加类型声

明的情况发生的, 但是编译器并不是这么严格!   所以函数无返回值时一定要加void 声明;


            以上是我现在对void 的理解,比较片面,以后会多加补充。

            谢谢!