C – 函数和void变量类型的指针?
请解释这样的原型是什么意思
void *runner(void *param)
- 变量类型如何无效?
- * runner的函数名称是什么意思?
- 它是函数的地址吗?
首先, void* runner
和void *runner
之间绝对没有区别。 该函数的名称是runner
。 其次,函数可以声明为void
,这意味着它根本不会返回任何内容。
但是这个签名是不同的。 它返回一个void*
,它只是指向未指定数据类型的指针。 或者更容易思考它,它返回一个内存地址。
void *param
,它只是接受一个内存地址。
编辑
这可能会让它更清晰一些:
void func(void *ptr); // take in a generic memory address, return nothing void *func(void *ptr); // take in a generic memory address, return similar void *func(void); // Function takes no parameters (necessary in C, optional in C++) void *func(void param); // Invalid! As you guessed, this would be pointless. void *func(); // Preferred syntax in C++, function takes in nothing and returns a generic memory address // In C this means it takes an undetermined number of arguments void func(); // In C++: function takes in nothing, returns nothing // In C: function takes in an undetermined number of arguments, returns nothing
问题1:变量类型为void *,而不是void。 这是一个通用指针,保证能够存储指向数据的指针。 它可能会或可能不会保存指向函数的指针,但这是另一个讨论。
问题2:函数名称不是* runner,它是runner。 在C / C ++空间中通常并不重要。
问题3:不,它只是意味着该函数返回另一个void *generics指针。 那些指针非常适合接受任何类型的变量(例如,在我们为我们做模板之前)。
function名称不是*runner
,它只是runner
。 它的返回类型是void * 。 同样,参数类型不是void
。 它void*
。 意思是指向任何东西的指针。
void*
是类型,而不是void
。 void*
是指向“某事”的指针。 它所指出的内容尚不清楚,但我们的想法是将它作为一种中性指针。 它可能指向任何特定的东西,因此赋予指针的函数必须具有关于这个东西实际指向的内容的隐含协议。
例如,如果您具有函数void FuncName(Type *value)
,则该value
是指向Type
对象的指针。 这是调用者和函数之间的明确协议,它将传递一个Type
对象指针。 编译器将防止意外传递错误类型的指针。 使用void*
意味着没有明确的协议。 可能存在隐式的,但编译器不会阻止您传递“错误”的东西。
void *runner(void *param)
是一个名为runner
的函数,它接受一个void*
参数并返回一个void *
返回值。 许多程序员喜欢将*
放在名称旁边,而不是在类型旁边。
C允许您使用void *作为指针类型来支持编写generics函数。 作为void * param可以采用任何类型的指针类型。 但是在处理这些指针时需要非常小心,因为它们有自己的一组限制。 您不能取消引用void *它必须转换为有效类型。 应用指针算法也是如此。
在这种情况下,runner是一个方法名称,它采用void *类型的参数,所以基本上它可以是任何类型,甚至是用户定义的ADT。 但是,大多数接受void *的函数都有一些调用者注册的回调函数。 然后调用调用程序进行数据处理,其中void *被传递回调用者,然后调用者知道void *的原始类型是什么,以便它可以将其转换为正确的类型。
这种情况的典型用法是qsort方法,它可以对任何用户定义类型的数组进行排序,只要调用者实现接受该类型的两个实例的比较器方法(通过void *)然后返回-1,0或1,具体取决于比较。 具体来说,qsort正在应用于int,然后比较器实现如下:
int compare(void * n1, void* n2) { int *i = (int*) n1; int *j = (int*) n2; if (*i < *j){ (now dereference the int*) return -1 } else if ( *i == *j) { return 0; } else { return 1 } }
首先: void *runner(void *param)
需要一个;
在末尾。 在进行原型设计时,你会提出一个“参考”,说“生病了以后”。 这允许您将其放在代码中,以免顶部变得杂乱无章。
Q1-答案:
void是函数的返回类型。 在这种情况下无效,你不会返回任何东西。 如果它是一个void变量,那么你可以在其中保存任何东西但是需要对其进行类型转换以获得其值。
Q2-答案:
*runner
和* runner
=同样的事情。 void*
是再次返回类型。 void
和void*
是非常不同的。 虽然它们看起来一样,但却非常不同。 像int*
和int
保存整数的地址而另一个保存整数值。
Q3-答案:
它不是函数的地址(如你所暗示的那样)的返回类型。 例如,如果您在代码之后有int*
,那么您将输入类似的内容
int* function() { int* a; *a = 5; //CODE HERE ... return a; }
所以它必须返回一个指向整数的指针,它不能返回一个int,因为编译器会抛出exception/错误。 它就像试图将char放入int中一样。
查看www.cplusplus.com上的所有文档,它真的很有帮助。
希望这个得到帮助!
和平。