void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据

void含义

void几乎只有注释和限制程序的作用,定义一个void变量没有意义

void的真正作用在于

  1. 对函数返回的限定
  2. 对函数参数的限定

    在C语言中,void *可以接受任意类型指针的赋值,而不需要进行内存强制转换
void *p1;
int *p2;
p1 = p2;

但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为无类型可以包容有类型,而有类型则不能包容无类型。以下语句在编译时候就会报错

void *p1;
int *p2;
p2 = p1;

void的理解

如果函数没有返回值,那么应声明为void类型

在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回int类型值处理

但在实际编程中,为了代码的可阅读和可维护,无返回值的时候要加上void

如果函数无参数,那么应声明其参数为void

虽然很多时候,在函数没有参数的时候,需要加上void

在C有的编译器中,如果不添加void,那么此函数会接受任意类型参数

所以,在函数不接受任何参数的时候要用void进行说明

小心使用void指针类型

在不同的C标准中,处理void指针的算法操作有着不一样的宽容度

ANSI认为,一切对void指针的运算操作都是非法的,会报错

而GNU则认为,void指针的算法操作和char *保持一致

为何兼容二者的思想,一般会对void指针进行转化,然后再对其操作

void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确

如果函数的参数可以是任意类型指针,那么应声明其参数为void *

典型的如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型

这两个函数的返回值也是void *

void不能代表一个真实的变量

void代表了一种抽象,而不是实实在在存在的变量

因此,不能定义一个void变量

void的使用

数据类型的封装

int InitHardEnv(void **handle);

典型的如内存操作函数memcpy和memset的函数原型分别为

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

void修饰函数返回值和参数,仅表示无

如果函数没有返回值,那么应该将其声明为void型

如果函数没有参数,应该声明其参数为void

int function(void)
{
return 1;
}

void指针的意义

C语言规定只有相同类型的指针才可以相互赋值

void*指针作为左值用于接收任意类型的指针

void*指针作为右值赋值给其它指针时需要强制类型转换

int *p1 = NULL;
Char *p2 = (char *)malloc(sizoeof(char) * 20);

不存在void类型的变量

C语言没有定义void究竟是多大内存的别名

深入理解C语言-深入理解void的更多相关文章

  1. 深入理解C语言-深入理解指针

    关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏.其实指针并不复杂,学习指针,要正确的理解指针. 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 指针就是告诉编译 ...

  2. 深入理解C语言-深入理解数组

    数组,作为C语言中常见的复杂数据类型,了解其本质有助于深入了解C语言 数组概念 元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大小 内存角度:联系的一大片内存空间 数组初始化 数 ...

  3. 深入理解C语言-深入理解内存四区

    数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...

  4. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  5. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  6. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  7. 深入理解c语言_从编译器的角度考虑问题_纪念Dennis Ritchie先生

    开源中国: Dennis Ritchie教授过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言.一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影 响,C++,Java,C ...

  8. "深入理解C语言" 指针

    本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ ]; ...

  9. (C)理解#define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

      理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) 嵌入式系统编程,要求程序员能够利用C语言访问固 ...

随机推荐

  1. 【Wince-禁止重复启动程序】Wince 不重复启动程序

    创建类Mutex.cs: using System; using System.Linq; using System.Collections.Generic; using System.Text; u ...

  2. C语言位运算题解

    #include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...

  3. BZOJ 1867 [Noi1999]钉子和小球 DP

    想状态和钉子的位置如何匹配想了半天...后来发现不是一样的吗$qwq$ 思路:当然是$DP$啦 提交:>5次(以为无故$RE$,实则是先乘后除爆了$long\space long$) 题解: 若 ...

  4. Solution: The process cannot access the file [filename] because it is being used by another process.

    http://www.brianstevenson.com/blog/solution-the-process-cannot-access-the-file-filename-because-it-i ...

  5. 洛谷P1436 棋盘分割

    洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...

  6. Win10 + CLion + 树莓派 + QT 远程开发调用Python

    原则:能在一个机器上开发的就不在两台机器上!! 首先需要配置远程QT开发环境 配置Cmake cmake_minimum_required(VERSION 3.14) project(qt_test) ...

  7. Rhel7.4系统部署cobbler

    cobbler安装 一.系统信息: [root@openstack ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server releas ...

  8. 为vue3.0学点typescript, 解读高级类型

    知识点摘要 本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer) 自动 ...

  9. JVM----双亲委派模型

    加载类的开放性 我们在了解双亲委派模型之前,不得不先了解一下什么是类加载器.虚拟机设计团队之初是希望类加载过程“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作能放到虚拟机外部实现,以便于让 ...

  10. 在linux上使用impdp命令时提示ORA-12154: TNS:could not resolve the connect identifier specified的问题

    今天在一台linux服务器上用impdp命令导入dmp文件时出现了错误: ORA: TNS:could not resolve the connect identifier specified 我使用 ...