关于void*和空指针

1.VOID*

void   *有时候又称为泛型指针,也就是可以指向任何类型的数据的指针,在大多数仅仅把一块内存看作raw   memeory,也就是没有任何类型信息的时候,就会把他定义为void   *,编译器对他的处理就是一个字节一个字节处理,类似于unsigned   char   *的处理方式,当然你的char类型必须是1个字节才行。   
在C的标准库中关于memory的操作<mem.h>几乎都是使用的void   *类型,将类型的转换交给程序员处理,否则相同的功能仅仅是因为数据类型不一样,就要提供一个函数,而偏偏C又不支持函数重载。

其实对C++和C来讲我们是不是可以这样想,C的malloc只是向系统申请了一块空白内存然后返回给你指向这块内存的指针,然后就什么都不做了;C++呢?记忆犹新的A*a=new A();其实C++做了三步,首先申请内存,其次在其上执行构造函数,最后把指针赋值给a;既然不是原子操作,就有可能产生问题,什么问题?cpu为了提高运行速度,对于代码第二步和第三步其实是可以交换的,试想有多线程代码判断一个类指针是否是null时,可能会出的情况;- -。。扯远了。

void(类型)指针,是一种特殊的指针,它足够灵巧的指向任何数据类型的地址空间。当然它也具有一定的局限:

在我们要取得指针所指地址空间的数据的时候使用的是 ‘*’操作符,程序员必须清楚了解到对于void指针不能使用这种方式来取得指针所指的内容。因为直接取内容是不允许的。而必须把void指针转换成其他任何valid数据类型的指针,比如char,int,float等类型的指针,之后才能使用'*'取出指针的内容。这就是所谓的类型转换的概念。

 

那void*可以理解成脚本语言中的万能varible变量?可以在需要的时候转换成任何数据类型。当然当转换的格式不对的时候,相应的内容也就不对了,甚至可能内存访问越界;

 

2.NULL

NULL指针是任何数据类型指针的一种。windows平台下说的很清楚

stdio.h

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

如果C++编译器就定义成0,否则定义成指向0的一个指针;

  1. #include <iostream.h>   
  2. int *exforsys;   
  3. void main()   
  4. {   
  5.   *exforsys=100;   
  6. }   

这里会运行出错,是很经典的一个错误,exforsys根本没有申请内存,怎么为他赋值呢?所以就有了

exforsys=new int();

我可以int *exforsys=NULL;于是我定义了一个指向0的整形指针;Void指针是一个可以指向任何数据类型的特殊指针。NULL指针不指向任何有效的地址空间或者引用,但是却可以被任何类型指针指向。

<think>好的,我现在需要帮助用户理解C/C++中void *result = 0的含义,以及它是否表示空指针。首先,我应该回顾一下用户提供的引用内容,尤其是引用1到4,因为它们直接讨论了空指针void*指针的区别。 根据引用1,空指针是没有指向任何有效对象的指针,通常用nullptr或NULL表示。而void*是一个可以指向任意类型但类型未知的指针。引用1特别指出void*nullptr不同,前者是有效指针但类型未知,后者是空指针。这说明虽然void*可以指向任何类型,但赋值为0可能空指针有关。 接下来,引用2中的例子显示,void* pv = pi; 这里的pi是一个int指针,所以pv被赋值为pi的地址,但之后需要强制转换才能解引用。而引用3则强调void*指针不能直接解引用,必须转换类型。此外,引用2还提到用(void*)0表示空指针,这可能意味着将0赋值给void*指针会使其成为空指针。 用户的问题是关于void *result = 0是否为空指针。根据C/C++标准,将指针赋值为0或NULL会被视为空指针。因此,即使result是void*类型,赋值为0时它应该成为一个空指针。但需要注意,在C++11之后,更推荐使用nullptr,因为NULL可能被定义为0或0L,而nullptr的类型更明确。 另外,引用1提到nullptr的类型是std::nullptr_t,而void*是一个类型,所以虽然void* result = 0在语法上是合法的,但使用nullptr会更安全,避免类型混淆。例如,在C++中,void* result = nullptr会更清晰。 用户可能存在的疑问是void*指针作为空指针其他类型的空指针有何区别。根据引用1,void*即使被赋值为0,仍然是一个void类型的指针,而空指针(如int* ptr = nullptr)是另一种情况。但他们的共同点是都不指向有效数据。 此外,引用3中的例子显示,void*指针需要强制转换后才能访问数据,所以即使result被赋值为0,如果尝试解引用它,必须进行类型转换,但由于它是空指针,解引用会导致未定义行为,比如崩溃。 总结来说,void *result = 0确实定义了一个空指针,但它属于void*类型。在C++中建议使用nullptr,而在C中可能使用NULL或0。同时,使用void*类型的空指针需要注意类型转换解引用的安全性。</think>### void *result = 0 的含义与空指针解析 在 C/C++ 中,`void *result = 0` 的定义包含以下关键点: 1. **空指针的定义** - **`0` 作为空指针常量**:在 C/C++ 中,将指针赋值为字面量 `0`(或 `NULL`)表示该指针不指向任何有效内存地址,即空指针[^1][^2]。 - **类型差异**:`void*` 是通用指针类型,可指向任意类型的数据,但 `0` 作为空指针常量会被隐式转换为 `void*` 类型的空指针。因此,`void *result = 0` 定义了一个不指向任何有效对象的空指针。 2. **与 `nullptr` 的区别** - **C++11 后的改进**:在 C++11 及更高版本中,`nullptr` 是更明确的空指针常量,其类型为 `std::nullptr_t`。而 `0` 或 `NULL` 是整数类型的宏,可能导致类型推导问题(例如重载函数调用时)。 - **兼容性**:`void *result = 0` 在 C 旧版 C++ 中合法,但在 C++ 中更推荐使用 `void *result = nullptr` 以提高代码清晰度。 3. **操作限制** - **解引用与运算**:`void*` 指针本身不能直接解引用或进行算术运算,必须强制转换为具体类型后才能操作[^3]。例如: ```cpp void *result = 0; int *p = (int*)result; // 需要显式类型转换 ``` - **空指针的安全性**:对空指针解引用会导致未定义行为(如程序崩溃)。 4. **应用场景** - 通用接口设计:`void*` 常用于需要处理多种数据类型的函数(如内存分配函数 `malloc`)。 - 空指针标记:`void *result = 0` 可表示函数返回结果未初始化或操作失败[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值