最近,当您查看线程池的实现时,pthread函数中会出现大量无类型的指针,如void *arg。 查一下各种资料,谈谈自己的理解吧。
void字面上为“无类型”,void *为“无类型指针”,void *可以指向任何类型的数据。(关键)
void指针指向的数据类型是待定的,如果要将该值分配给其他值,则进行类型转换。但是,任何类型的指针都可以直接分配给void*,不需要强制执行类型转换:例如:
void *arg; int i; I=(int* ) arg;
任何类型的指针都可以直接分配给void*,无需强制类型转换。
void *p1; int *p2; p1=p2; 定义void类型时:
void a;
此语句在编译时发生错误。 即使void a的编译不发生错误,也没有实际意义。void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void变量。
void关键字的使用规则:
1 .如果函数没有返回值,则声明为void类型
2 .如果函数没有参数,则声明该参数为void;
3 .如果函数的参数是任意类型的指针,则该参数为void *;
4. void不能表示真正的变量;
以下详细说明:
void真正发挥的作用是:
)1) 对函数返回的限定;
)2)对函数参数的限定。
1 .如果函数没有返回值,则声明为void类型
在c语言中,不约束返回类型的函数被编译器视为返回整型值。 但是,很多程序员误认为是void类型。 例如:
add(inta,int b ) {return a b; //返回的是int型。 当然,我们在编写C/C程序时,必须对任何函数都毫无遗漏地指定其类型。 如果函数没有返回值,请确保将其声明为void类型。 这既是程序可读性的需要,也是编程规范性的要求。
谨慎使用void指针类型
ansi (美国标准)标准不允许对void指针进行算法操作。 也就是说,以下操作都不合法。
void * pvoid; pvoid; //ANSI :错误pvoid =1; //ANSI :之所以这样认定错误//ANSI标准,是因为他主张执行算法操作的指针必须确实知道指向数据类型的大小。 //例: int *pint; 打印; //ANSI :正确的GNU不会这么认定。void *的算法操作与char *一致
因此,以下语句在GNU编译器中是正确的。
pvoid; //GNU :正确的pvoid =1; //GNU :正确的3 .如果函数的参数可以是任何类型的指针,应该将该参数声明为void *。 比如刷广告主题时常用的memset函数,看到他的原型==觉得自己low爆炸了,就一直在用void *。
void*memset(void*buffer,int c,size_t num );
以及void*memcpy(void*dest,const void *src,size_t len );
这样,任何类型的指针都可以传递给memcpy和memset。 它如实表达了内存操作函数的含义,无论该内存是什么类型的内存。 同时返回的也是void *型;
我想通过这个函数的原型,可以直观地理解void*。
主要参考: http://Zheng dl 126.iteye.com/blog/1739165