void* & NULL & nullptr
2023-04-09 本文已影响0人
hehehehe
一、C程序中的NULL
在C语言中,NULL通常被定义为:
#define NULL ((void *)0)
二、C++程序中的NULL
void*是不能隐式转换
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。
- void*可以指向任何类型的地址,但是带类型的指针不能指向void*的地址
float f = 5.5;
float* pf = &f;
void* pv = pf;
float* pf2 = pv;//编译错误,有类型的指针变量不能指向void*变量
- void*指针只有强制类型转换以后才可以正常取值
int main(int argc, const char * argv[]) {
float f = 5.5;
float* pf = &f;
void* pv;
pv = pf; //这句是可以的
cout<<*pv<<endl; //编译错误,这样直接对pv取值是错误的
cout<<*(float*)pv<<endl; //强制类型转换后可以取值
return 0;
}
image.png
应用
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
int *a=NULL;
a=(int *)malloc(sizeof(int));//返回的是void*,所以赋值给其他指针类型要强转一下
同样的,malloc函数只关注你要多大的内存,你需要把它怎么划分是你的事情,但是你需要显式的表明你是怎么划分的。这里语法要求是必须的,void *类型转为其他类型必须强制类型转换