2012-09-01 18 views
3

函数定义混乱,我发现这个函数的定义关于用C

void *func(void *param) { 

} 

其实,我对本函数定义了一定的混乱。 void *在函数的返回类型以及参数中表示什么。我是C的初学者,所以请不要介意。谢谢

void *func(void *param) { 
    int s = (int)param; 
    .... 
} 

看看上面的程序,我找到了。我认为它应该是

int *s = (int *)param; 

不是吗?我很困惑

回答

5

void *意味着它是一个没有特定类型的指针,把它看作是一个通用指针,不像int *一个int指针。

如果需要的话,你可以将它转换成不同的类型(例如,如果你要用指针做指针运算)。

您可能会发现使用这太问题:Concept of void pointer in C programming

+0

你甚至不需要将它转换为不同的类型,它将自己转换为任何其他对象指针。 –

2

它只是意味着该函数func需要一个参数是一个指针(任何事情),并返回一个指针(任何事情)。当你使用一个void *时,你告诉编译器“这是一个指针,但在这一点上它并不重要,它指向什么”。

当你想要实际使用它指向的数据时,你需要将它转换为指向其他类型的指针。举例来说,如果它指向一个int,您可以创建一个int *变量和反引用是:

int *int_ptr = (int *)param; 
// now (*int_ptr) is the value param is pointing to 
0

返回任何类型的指针。它可以是任何数据类型。

1

你可以把它看成是一个原始指针,没有什么比一个地址多,想想看,指针无非地址正确的多,所以他们都应该是相同大小的,在最现代化的系统是32位或64位但如果这就是为什么我们说int *char *左右,如果他们都是一样的大小,以及那是因为我们需要的方式来诠释我们都指向型,int *意味着当我们提领去该地址和情况将4个字节解释为intchar *意味着当我们取消引用到该地址并获取一个字节时,如果您取消引用void *,那么会发生什么warning: dereferencing ‘void *’ pointer基本上,我们确实无法做到这一点,如果您的影响是编译器相关的,当我们做算术时也是如此在上面。

那么为什么要使用它们呢?以及我个人不和某些群体不特别喜欢他们,他们根本允许你创建相当通用子程序,一个很好的例子是memset它设置的内存块的某个字节的值,它的第一个参数是void *所以不会抱怨是否给出char *int *应注意的是它以每个字节为基础工作,并且您需要正确计算数组的总大小。

0
void *func(void *param) { 

} 

param是一个void指针,意味着它是任何引用类型的指针。由于void指针没有对象类型,除非是大小写,否则不能解除引用。

so void *param; 
    int *s=(int*)param; 

在这里,因为一个参数是一个指针变量,所以你会像你一样有投它作为一个指针variable.not到整型。

例如

int x; 
float r; 
void *p=&x; 
int main() 
{ 
    *(int *)p=2; 
    p=&r; 
    *(float*)p=1.1; 
} 

在这个例子中,p是一个void指针。现在在主要方法中,我将p作为一个int指针,然后作为一个浮点指针,以便它可以引用第一个整数,然后是float。