void:你以为你很了解我?你个渣男~

目录

一、总述

二、分述

(1)void类型

void为什么无法用来定义变量?

(1)void修饰函数返回值

(2)void指针类型(作用:通常用来设计通用接口)

三、需要注意的代码

代码1

代码2


一、总述

void 声明函数无返回值或无参数,声明无类型指针

二、分述

(1)void类型

void为什么无法用来定义变量?

void无法用来定义变量,因为不确定该开辟多少空间。在vs中,sizeof(void)的结果是0在linux中用sizeof(void)结果是1void无法用来定义变量的原因除了内存空间大小不确定之外,更重要的原因就是vlid类型本身就被编译器解释为空类型,所以编译器就强制的不允许用其来定义变量。

定义变量的本质就是开辟空间 而void作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待,所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义变量。同样的,也无法通过void进行强制类型转换。

(1)void修饰函数返回值

1、占位符,让用户明确不需要返回值

2、告知编译器没有返回值,即如果用户用变量接收返回值的话就会报错

3.void充当函数的形参列表:告知用户或者编译器,该函数不需要传参。

结论:如果一个函数没有参数,就在()内加上void;如果一个函数不需要返回值或者没有返回值,就在返回值类型处加上void。

int test1()
{
    return 1;
}
int test2()
{
    return 2;
}
int main()
{
    test1(1,2,3,4);//编译器在vs上不会报错且不会有警告可以正常运行,在linux中一样可以正常编译。
    test2(1,2,3,4);//编译器在vs上不会报错但会有警告可以正常运行,但是在linux中无法正常编译。
    //上述两种情况对于传参时在栈区中开辟内存都没有任何的影响(在vs中)
}

(2)void指针类型(作用:通常用来设计通用接口)

注意:void*是可以定义变量的,因为指针占据的内存大小是明确的。

应用:void*可以被任何类型的指针接收,同时void*可以接收任意指针类型(常用),在库函数中,系统的接口设计上 ,尽量设计成通用接口,从而就收各种类型的数据,例如memset()函数。

三、需要注意的代码

代码1

#include<stdio.h>
int main()
{
    void *p =NULL;
    p++;
    p--;
    //上面这两种写法,编译器均会报错,因为不明确++或者--应该跨越的步长,换言之,如果想进行类似的++或者--操作
    //就需要明确指针指向的变量类型所占据的内存空间的大小,之前已经指出,void在vs中所占据的内存空间大小为0.且
    //无法被用来定义变量,所以自然无法用来进行++--的操作,但是在linux中是可以运行的,因为linux中明确了void
    //类型的大小为1。
}

代码2

注意:C语言中无法对void *类型指针变量进行解引用,例如下面这段代码就会报错:

int main()
{
    int a = 10;
    void * p = &a;//因为void类型的指针可以接收任意类型的数据的指针(地址)
    
    *p=20;
    printf("%d",*p);
    //这两段代码都会报错,p是void*类型的,对p解引用,*p就是指向指针所指向的目标或者说类型,对p解引用
    //*p的类型就是void,而编译器无法通过void类型来解析其对应的空间及类型以及里面的数据,所以编译器会
    //报错,在Linux中同样无法正常的运行。因为在vs和Linux中均无法用void来定义变量
    return 0;
}

Guess you like

Origin blog.csdn.net/m0_57304511/article/details/121525689