C++ void*用法记录

void的字面意思是空类型,void *的意思是空类型指针,void 不是一个真正的类型,咱们在声明变量的时候历来不会像下面这样声明:函数

void a;指针

若是咱们写了一行这样的代码,某些编译器会直接报错,有些则不会,但也没有任何意义。原型

 

void真正的用途在下面两个方面:编译器

  1. 对函数返回值的限定编译

  2. 对函数参数的限定class

     

 

好比,函数没有返回值,那么函数可能会声明成这样:void fun(int a);变量

若是函数有返回值,可是函数没有参数,那么函数的可能会声明成这样:int fun(void)。gcc

 

以上的状况都是很好理解的。下面介绍void *的一些用法。gc

 

1. 函数可接受任意类型的指针。类型转换

用过memset或者memcpy的细心的人会发现,在gcc中编译相似下面的代码都不会有警告:

int a;

int *p = &a;

memset(p, 0, 4);

或者

char c[4];

char *p = c;

memset(p, 0, 4);

为何memset传int *仍是char *都没有问题呢?咱们知道不一样类型间复制是要进行强制转换的,那么这里为何不用强制类型转换呢。咱们看memset的原型会发现,memset的第一个参数就是void *。

 

2. void *类型能够接受任意类型指针。

例如:

void *p1;

char *p2 = “hellp”;

p1 = p2;

这是没有问题的,任何类型的指针均可以直接赋值给它,无需进行强制类型转换。但须要注意的一点是,void *的类型并不能无需类型转换直接赋值给其余类型,好比malloc的返回值是void *,那么咱们通常这样写:char *p = (char *)malloc(4);

 

3. void *类型不能作运算

好比咱们不要作相似这样的操做:

void *p;

p++;

说白了void并非一个真实的变量,void能够看做一个抽象概念。

 

以上说法因为C标准不一样,可能有部分差别,须要特殊对待,但大致就是这样的。

相关文章
相关标签/搜索