我要建设网站
我要开发软件
我要了解网站技术
我要做网站推广
技术中心
网络开发技术 更多>>
 
正文  当前位置:主页 > 技术中心 > 网络开发技术 >

void和void指针解析(原)

发布时间:2012-02-23 发布来源:

一个国度若是法纪不正,其国风必然衰颓(一)根蒂根基概念

人生所贵在亲信,四海重逢骨肉亲。    void 类型:空类型,用于特别目标的没有操纵,也没有值的类型。不克不及被显式或隐式的转换为随便率性非空类型,可以经由过程强迫类型转换为void类型。

    void指针:指向任何对象的指针都可以转换为void*类型指针,且不会丧失期息。在ANSI C应用类型void*庖代char*作为通用指针的类型。

(二)应用办法

1. void的应用

第一种是:对函数返回的限制

    在不加返回值类型限制的景象之下,编译器会将其处理惩罚为整型的类型。例如以下的景象:

#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)
  • 面向对象软件设计原则(二) —— 软件设计的堕落
  • 空行引起的祸端
  • 浏览文件夹对话框初始化时选中所指目次