C/C++中的void和void*

一、void

void关键字表示“空类型”的概念。但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西.

void表示“不存在”的意思,可以从void的两个应用中加以体现:
1、void作为函数的返回值类型时,表示函数返回值不存在,即函数没有返回值。
例如:
void FunctionNoReturn_0(std::string strName)
{
 std::cout << strName << std::endl;
 return;
}
void FunctionNoReturn_1(std::string strName)
{
 std::cout << strName << std::endl;
}
FunctionNoReturn_1函数体中虽然没有显式的Return;语句。但是,有隐式的Return;表示函数不存在返回值。
FunctionNoReturnType(void)
{
 return 10;
}
在C语言中,凡是不加返回值类型限定的函数,就会被编译器作为返回整型值处理,而不是没有返回值。所以,FunctionNoReturnType函数返回10是正确的。
在C++中,每个函数必须限定返回值类型,不允许不加返回值限定。所以,C++编译器会对FunctionNoReturnType报错。
2、void作为函数的参数的限定时,表示函数形参不存在,即函数没有形参。
例如:
void FunctionNoArgument_0(void)
{
 return;
}
void FunctionNoArgument_1()
{
 return;
}
注意:void FunctionNoArgument_1();这也表示没有形参。
在C语言中,FunctionNoArgument_1(10);是合法的。编译器不会报错。
在C语言中,FunctionNoArgument_0(10);是不合法的。编译器会报错。
在C++语言中,FunctionNoArgument_1(10);和FunctionNoArgument_0(10);
都是不合法的。编译器会报错。
C语言中不报错,也没什么关系的。因为,参数10对于函数的执行的结果没有影响。但是,对于代码的维护可能会造成隐藏的危害,可能会给别人造成误解。

说明:既然提供了void的这两种用法,就去运用。即函数没返回值就将其返回值类型写为void,函数没有形参就将其形参写为void。不了解编译器默认操作时,不要依赖。即使了解其默认操作,也别依赖,因为肯定有人不了解的,这样别人就看不懂你的代码了。

二、void*

void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”。(为什么不用void表示任意类型的数据呢?大家都知道,C/C++是静态类型的语言,定义变量就会分配内存,然而,不同类型的变量所占内存不同,如果定义一个任意类型的变量,如何为其分配内存呢?所以,C、C++中没有任意类型的变量。但是,所有指针类型的变量,无论是int*、char*、string*、Student*等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”)。

C++/ANSI C:
void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void指针或从函数返回void*指针;给另一个void*指针赋值。不允许使用void*指针操作它所指向的对象,例如,不允许对void*指针进行解引用。不允许对void*指针进行算术操作。
GNU C:
GNU C指定void*指针的算术操作与char*一致。

void*表示“任意类型的指针”,主要运用于内存操作函数的形参类型和返回值类型(内存操作与内存中数据类型无关,即任意类型都可以)。

memcpy  
原型:extern void *memcpy(void *dest, void *src, unsigned int count);   
用法:#include   
功能:由src所指内存区域复制count个字节到dest所指内存区域。   
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。   
注意:与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。

C/C++中的函数中的void和void* 理解相关推荐

  1. C语言algorithm主函数,C语言中主函数中相关有关问题?

    C语言中主函数中相关问题??? #include #include #include #include #include #include #include #include #include usi ...

  2. linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;

    为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...

  3. python中size的用法.dim_对于numpy中的函数的参数dim的一点理解

    对于numpy中的函数的参数dim的一点理解 经常被dim参数搞混.试着总结了一下.记忆瞬间清晰了 以.max(dim)方法为例: >>> import numpy as np &g ...

  4. vue中在一个函数中调用另外一个函数

    vue中在一个函数中调用另外一个函数 this.$options.methods.函数名.bind(this)();

  5. matlab优化问题约束不取等号6,matlab中fmincon函数中不含等号的边界值怎么设置?,matlab中的fmincon函数一直求不出为什么...

    导航:网站首页 > matlab中fmincon函数中不含等号的边界值怎么设置?,matlab中的fmincon函数一直求不出为什么 matlab中fmincon函数中不含等号的边界值怎么设置? ...

  6. linux中main数据手册,linux中main()函数中参数来源.doc

    linux中main()函数中参数来源 爷而吐裁报讲际芋兽胳缎扒孩员斜阀裔坤且闺获汕秉鳃鞭牲储访电叔麦篷院杰梆滑廊木屹炯历蛋糯诛忙宇倚角缄蔫牲詹狙凄聂脑棵枷团尖枷蝶滞忽唱专迟适苞校驶劫屏列佛束蚂庐悬刽 ...

  7. QT中main函数中加载外部字体:OTF

    QT中main函数中加载外部字体:OTF 我们开发的程序中,如果想使用外部下载的开源字体,同时保证在软件发布时,程序字体能保证和开发者环境下一致,且不想通过安装字体方式实现字体跟随软件时,我们需要在代 ...

  8. linux中probe函数中传递的参数来源(上)

    点击打开链接 上一篇中,我们追踪了probe函数在何时调用,知道了满足什么条件会调用probe函数,但probe函数中传递的参数我们并不知道在何时定义,到底是谁定义的,反正不是我们在驱动中定义的(当然 ...

  9. java用if语句调用方法_J2SE中main函数中的if语句想要调用另一个类的方法怎么能实现?...

    日常生活中,要完成一件复杂的功能,我们总是习惯把"大功能"分解为多个"小功能"以实现.在C++程序的世界里,"功能"可称呼为"函数 ...

最新文章

  1. golang make()内置函数
  2. 导入特征怎么实体化_幼儿教师开展集体活动开场导入方法 看过的都说很实用!...
  3. FileZilla客户端连接腾讯云FTP服务器时出现“227 Entering Passive Mode”
  4. 【C语言小游戏】走迷宫
  5. 如何更换tomcat版本
  6. vs2005让程序在win7下获得管理员权限
  7. jquery 图片裁剪 java,jQuery实现图片上传和裁剪插件Croppie
  8. Idea突然不停indexing的问题
  9. 大数据资源争夺战此起彼伏,对用户而言是福是祸
  10. 很久以前某位大仙对petri网的总结
  11. 1.3 博弈结构和博弈的分类
  12. HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)
  13. QT UI界面组件介绍
  14. 网络安全(一):常见的网络威胁及防范
  15. Teamin群协作如何在微信上更好实现团队协作?
  16. CSR、GPR、FPR
  17. 基于神经网络rnn模型心脏病特征预测心脏病
  18. Hook源码+插件化实现无闪烁换肤
  19. 西门子M440变频器手册
  20. 无监督单目深度估计 Unsupervised Monocular Depth Estimation with Left-Right Consistency 论文方法分析

热门文章

  1. ROS集成开发环境搭建
  2. 修改framework后重新刷入手机
  3. vCenter6.0配置二:配置HA群集
  4. vue-cli安装、node-sass安装、mintUI组件库安装
  5. Rider首个发布候选版加入了性能提升特性
  6. Oracle——15触发器
  7. QGIS简介与源代码编译
  8. 什么样的技术人员更容易接到软件开发项目?(论干私活儿)
  9. caffe loss
  10. Java导入导出CSV文件