Summary

1) 个别工程开发中须要禁用goto语句,不同的编译器对goto语句的错误处理可能不同。

2)在C语言中,如果函数没写返回值,则默认返回值类型是int;如果函数没有写参数列表,则函数承受任意数量的参数
因而,如果函数没有返回值,必须显式申明返回值类型为void;如果函数没有参数,则必须申明参数列表为void。

3)void是一种根底类型,但不是根底数据类型,所以无奈用来定义变量(C语言没规定void是多大内存空间的别名)。

4)对于规范C语言标准,不容许sizeof(void)这种写法,如bcc编译器;对于扩大C语言,可能容许sizeof(void)这种写法,如gcc编译器,输入为1。

5)void*指针的次要作用是:用于接管任意类型的指针。在C语言中,void*type*能够互相转换;在C++中,void*能够作为左值接管任意类型的指针,作为右值时,必须进行强制类型转换

goto和void

1、goto

goto语句带有很浓重的汇编语言个性,可能跳转到指定的语句,如同汇编语言的跳转指令。
在工程实际中,个别都禁用“goto”。goto会毁坏程序的构造,带来意想不到的谬误

// 代码示例:以下代码输入什么?int main(){goto End;    int i = 0;End:    printf("i = %d\n", i);    return 0;}
  • gcc编译器:编译谬误error,提醒i变量的初始化被跳过了。
  • vs编译器:编译正告warning,提醒i未初始化,然而编出了可执行程序。运行的后果是随机值,意料之外的谬误!

2、void

2.1 void润饰返回值和参数

在C语言中:

  • 如果函数没有返回值,那么应该将其申明为void
  • 如果函数没有参数,应该申明其参数为void

留神, C语言中:

  • 如果函数没写返回值,默认的返回值类型是int
  • 如果函数没有申明参数列表,默认承受任意多参数

    f(){}int main(){  int i = f(1, 2, 3);        // ok  return 0;}

2.2 是否存在void类型的变量?

论断:不存在void类型的变量

void是一种根底类型,但不是根底数据类型;C语言中没有定义void到底是多大内存的别名,所以也无奈定义对应的变量。

int main(){    void var;        // error    void arr[5];     // error    return 0;}

小贴士:

  • ANSI C:规范C语言标准,如bcc编译器
  • 扩大C:在ANSI C的根底上进行了扩大,如gcc编译器

    // void类型有大小么?int main(){  prinft("%d\n", sizeof(void));  return 0;}
  • gcc编译器,Demo能够编过,输入为1
  • bcc编译器,编译谬误,提醒void是不容许的类型。

2.3 void类型的指针

  • 在C语言中,对指针类型的查看不那么严格,所以void类型的指针能够和任意数据类型的指针进行互相转换

    // test.cint main(){  int* p = nullptr;  void* pv = p;         // ok    char* pc = pv;        // ok  return 0;}
  • 在C++语言中,对类型进行了加强,共事也兼容了C语言中的写法。void能够作为左值承受任意类型的指针,然而,void作为右值时,就必须进行强制类型转换

    // test.cppint main(){  void* pv = nullptr;        // 初始化是个好习惯    int* pi = pv;          // error, invalid conversion from void* to int*  int* pi = (int*)pv;    // ok, due to cast  return 0;}

总结:void*指针的次要作用是,用于接管任意类型的指针
示例Demo:将数组所占内存全副置0

void MemSet(void* src, int length, unsigned char n){    unsigned char* p = (unsigned char*)src;    int i = 0;    for(i=0; i<length; i++)    {        p[i] = n;    }}int main(){    int a[5];    int i = 0;    MemSet(a, sizeof(a), 0);    for(i=0; i<5; i++)    {        printf("%d\n", a[i]);    }    return 0;}

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请斧正。