函数中的指针和void变量类型

C - pointers in functions and void variable type?

本文关键字:void 变量 类型 指针 函数      更新时间:2023-10-16

请解释一下这样的原型是什么意思

void *runner(void *param)
  1. 变量类型如何为空?
  2. 带*runner的函数名是什么意思?
  3. 是函数的地址吗?

首先,void* runnervoid *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 *泛型指针。这些指针非常适合接受任何类型的变量(例如,在我们没有模板为我们做这些之前)。

功能名称不是*runner,只是runner。返回类型为void*。同样,参数类型不是void。它是void*。意思是指针可以指向任何东西。

void*是类型,而不是voidvoid*是指向"某物"的指针。它指向什么还不清楚,但我们的想法是让它作为一种中立的指针。它可以指向任何特定的东西,所以被赋予指针的函数必须对这个东西实际指向的东西有一个隐含的协议。

例如,如果你有一个函数void FuncName(Type *value), value是一个指向Type对象的指针。这是调用者和函数之间的显式协议,它将被传递一个Type对象指针。编译器将防止意外传递错误类型的指针。使用void*意味着没有明确的协议。可能有一个隐式的,但是编译器不会阻止你传递"错误"的东西。

void *runner(void *param)是一个名为runner的函数,它接受一个单独的void*参数并返回一个单独的void *返回值。许多程序员喜欢将*放在名称旁边,而不是类型旁边。

C允许使用void*作为指针类型来支持编写泛型函数。作为一个void*参数可以接受任何类型的指针类型。然而,在处理这些指针时需要非常小心,因为它们有自己的一组限制。不能对void*进行解引用,必须将其强制转换为有效类型。应用指针运算也是如此。

在这种情况下,runner是一个方法名,它接受void*类型的参数,所以基本上它可以是任何类型,甚至是用户定义的ADT。然而,大多数接受void*的函数都有调用者注册的某种回调。然后调用者被回调进行数据处理,其中void*被传递给调用者,然后调用者知道void*的原始类型是什么,以便它可以将其转换为正确的类型。

一个典型的用法是qsort方法,它可以对任何用户定义类型的数组进行排序,只要调用者实现comparator方法,该方法接受该类型的两个实例(通过void*),然后根据比较返回-1,0或1。具体来说,如果qsort应用于整型那么比较器的实现是这样的:

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-Answer:
Void是函数的返回类型。在这里是void,你不会返回任何东西。如果它是一个void变量,那么你可以在其中保存任何东西,但需要对它进行类型转换以获得它的值。

Q2-Answer:
*runner* runner =相同的东西。void*又是返回类型。voidvoid*是非常不同的。虽然他们看起来一样,但他们有很大的不同。像int*int一样,一个保存整型的地址,另一个保存整型的值。

Q3-Answer:
它不是函数的地址(正如你所暗示的),而是返回类型。例如,如果你的代码后面有int*你可以输入

int* function()
{
    int* a;
    *a = 5;
    //CODE HERE
    ...
    return a;
}

所以它必须返回一个指向整型的指针,它不能返回int型,因为编译器会抛出异常/错误。这就像把一个char放进一个int。

查看www.cplusplus.com上的所有文档,它真的很有帮助。

希望有帮助!

和平。