文档章节

void类型

小绿豆蛙
 小绿豆蛙
发布于 2014/06/18 15:50
字数 884
阅读 5
收藏 0

void: 

含义:无类型   

作用:说明性,说明函数无参数或者无返回值。

void *:

含义:无类型指针,可以指向任何数据类型

作用:int * pint  ;  void *pvoid ;   那么pvoid = pint;   不能是pint  = pvoid;  必须是pint = (int *)pvoid; 因为”无类型“包含”有类型“,“无类型”相当于“各种类型”。

在ANSIC标准中不允许void*类型直接做运算操作[pvoid++等等],

eg:void *memset(void *buffer, int c, size_t num);

void *memcpy(void *dest, const void *src, size_t len);

所以在写项目时候定义函数入口时有必要把参数定义成void*类型,像memcpy一样,这样使用就更灵活。

typedef:

是个关键字,这个关键字一般在项目上用来定义函数的类型。例如:typedef void *callback_t(void *context);

callback_t *callback;

为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部

分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化

版。举例: 

 原声明:void (*b[10]) (void (*)());

变量名为b,先替换右边部分括号里的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

  
原声明:doube(*)() (*e)[9];

变量名为e,先替换左边部分,pFuny为别名一:

typedef double(*pFuny)();

再替换右边的变量e,pFunParamy为别名二

typedef pFuny (*pFunParamy)[9];

原声明的最简化版:

pFunParamy e;

int (*func)(int *p);

首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针

;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以

func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值

类型是int。

int (*func[5])(int *);

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明

func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符

优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数

组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

头文件相互包含:

头文件在定义时候最好能够按模块来区分,尽量减少头文件相互包含,会出很多麻烦的问题。例如'struct xxx'在形参中声明呀什么的,警告这不是你想要的什么什么的,这些个错误类型是如果类型定义的完整那么就是由于相互包含引起的,可以把出错的变量直接在报错头文件中声明一下就可以了。最好头文件也与模块一起独立出来。很有一个很奇怪的问题就是当用typedef定义函数类型时候在一个头文件中定义另一个头文件使用时候就报错意思说”找不到定义“,但是两个头文件要是一起定义就会说”重复定义“也不知道为什么?最后只能各定义各的用不同的名字相同的类型。


© 著作权归作者所有

共有 人打赏支持
上一篇: linux的send和recv
下一篇: signal信号
小绿豆蛙
粉丝 0
博文 33
码字总数 13280
作品 0
海淀
程序员
私信 提问
C/C++语言void及void指针《转》

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的...

狂斩一条龙
2011/08/20
0
0
void *指针

·C++提供了一种特殊的指针类型void* ,它可以保存任何类型对象的地址 double obj=3.14; double pd=&obj; void pv=&obj; pv=pd; void 表明该指针与一地址相关,但不清楚存储在此地址上的对象...

种地瓜
2016/08/20
17
1
【转】 void与void*详解

void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型; 2. 如果函数无参数,那么应声明其参数为void; 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ; ...

qq_26512811
2017/12/13
0
0
void及void指针深层次探索

1.概述   许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。   ...

地狱的烈火
2013/04/26
0
0
C/C++语言void及void指针

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的...

技术小阿哥
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部