void和void指针解析(原)
发布时间:2012-02-23 发布来源:

一个国度若是法纪不正,其国风必然衰颓(一)根蒂根基概念 人生所贵在亲信,四海重逢骨肉亲。&#160;&#160;&#160; void 类型:空类型,用于特别目标的没有操纵,也没有值的类型。不克不及被显式或隐式的转换为随便率性非空类型,可以经由过程强迫类型转换为void类型。 &#160;&#160;&#160; void指针:指向任何对象的指针都可以转换为void*类型指针,且不会丧失期息。在ANSI C应用类型void*庖代char*作为通用指针的类型。 (二)应用办法 1. void的应用 第一种是:对函数返回的限制 &#160;&#160;&#160; 在不加返回值类型限制的景象之下,编译器会将其处理惩罚为整型的类型。例如以下的景象: #include <stdio.h>
// 参考了别人写void的例子,然则这个例子十分形象
// 的注解了不加返回类型值限按时,编译器的处理惩罚规矩。
add (int a, int b)
{
return a + b;
}
int main(int argc, char* argv[])
{
printf("2 + 3 = %d", add (2, 3));
return 0;
}
&#160;&#160;&#160; 对于每个函数, 我们都要明白的指定其返回值的类型。该void的时辰,就void。不要省略不写,这回带来大麻烦 。
第二种:对函数参数的限制
&#160;&#160;&#160; 当函数不容许接管参数时,必须应用void限制。例如以下两种景象:
在C说话下:
#include <stdio.h>
// 以下两个函数都可以进行正常的编译,不会报错。
// C的容忍度还是很大的。。。
int func()
{
return 1;
}
int func1(void)
{
return 1;
}
int main(int argc, char* argv[])
{
printf("%d
", func(2));
printf("%d
", func1(2));
return 0;
}
运行成果 :

在C++说话下:
#include <iostream>
int func()
{
return 1;
}
int func1(void)
{
return 1;
}
int main(int argc, char* argv[])
{
std::cout << func(1) << std::endl;
std::cout << func1(1) << std::endl;
return 0;
}
运行成果 :

&#160;&#160;&#160; 在C说话中,可以给无参数的函数传送随便率性类型的参数,然则在C++编译器中编译同样的代码则会失足。 在C++中,不克不及向无参数的函数传送任何参数。
2. void指针的应用
&#160;&#160;&#160; 在《C++ primer》中,对void指针的感化做了论说:与另一指针斗劲;向函数传递void指针或从函数返回void指针;给void指针赋值。
&#160;&#160;&#160; 因为void指针可以指向随便率性类型的数据,亦即可用随便率性数据类型的指针对void指针赋值,是以还可以用void指针来作为函数形参,如许函数就可以接管随便率性数据类型的指针作为参数。
以下摘至sgi stl中的代码片段:
/* __n must be > 0 */
static void* allocate(size_t __n)
{
void* __ret = 0;
if (__n > (size_t) _MAX_BYTES) {
__ret = malloc_alloc::allocate(__n);
}
else {
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n);
// Acquire the lock here with a constructor call.
// This ensures that it is released in exit or during stack
// unwinding.
ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
endif
_Obj* __RESTRICT __result = *__my_free_list;
if (__result == 0)
__ret = _S_refill(_S_round_up(__n));
else {
*__my_free_list = __result -> _M_free_list_link;
__ret = __result;
}
}
return __ret;
}
/* __p may not be 0 */
static void deallocate(void* __p, size_t __n)
{
if (__n > (size_t) _MAX_BYTES)
malloc_alloc::deallocate(__p, __n);
else {
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n);
_Obj* __q = (_Obj*)__p;
// acquire lock
ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
endif /* _NOTHREADS */
__q -> _M_free_list_link = *__my_free_list;
*__my_free_list = __q;
// lock is released here
}
}
&#160;&#160;&#160; 对于指针的自增行动,要逢迎ANSI C 的规范。在ANSI C中void指针不克不及自增的,这种行动是一种不法行动,因为未知void的大小。
#include <iostream>
int main(int argc, char* argv[])
{
int i = 0;
void *p;
int *pint;
int *pint1;
pint = &i;
p = pint;
std::cout << pint << std::endl;
pint++;
std::cout << pint << std::endl;
std::cout << p << std::endl;
pint1 = (int *)p;
std::cout << pint1 << std::endl;
return 0;
}
运行的成果:

文献参考:
1. 《C++ primer》和《C说话法度设计》
2.http://wenku.baidu.com/view/22c4b8d86f1aff00bed51edc.html这篇文章很出名啊 ,很多void的文章都是转载这一篇文章的。塞内加
《更多网站建设信息、网站开发资讯,敬请咨询百微信息科技,021-57700304》
面向对象软件设计原则(三) —— 软件实体的设计原则
rails 与 mysql 5.X for win不兼容
【第六章】 AOP 之 6.7 通知次序 ——跟我学spring3 【私塾在线原创】
python懂得-对象类型
标准设备的UBUNTU 11.10 RUBY VMWARE 镜像,手工MOD(ZSH_RVM_RAILS_VIM)
面向对象软件设计原则(二) —— 软件设计的堕落
空行引起的祸端
浏览文件夹对话框初始化时选中所指目次
|