C 函数名前的星号的函数是什么?
我对我在大多数C程序中看到的对我来说不熟悉的函数声明感到困惑C 函数名前的星号的函数是什么?,c,function,pointers,C,Function,Pointers,我对我在大多数C程序中看到的对我来说不熟悉的函数声明感到困惑 void *func_name(void *param){ ... } *对函数意味着什么?我对变量类型(*)的理解是,它创建了指向另一个变量的指针,因此它可以跟踪后一个变量在内存中存储的地址。但是在函数的这种情况下,我不知道星号意味着什么。星号属于返回类型,而不是函数名,即: void* func_name(void *param) { . . . . . } 这意味着函数返回一个空指针。该*属于返回类型。此函数返回vo
void *func_name(void *param){
...
}
*
对函数意味着什么?我对变量类型(*
)的理解是,它创建了指向另一个变量的指针,因此它可以跟踪后一个变量在内存中存储的地址。但是在函数的这种情况下,我不知道星号意味着什么。星号属于返回类型,而不是函数名,即:
void* func_name(void *param) { . . . . . }
这意味着函数返回一个空指针。该
*
属于返回类型。此函数返回void*
,一个指向未指定类型的某个内存位置的指针
指针本身是一种变量类型,其值为某个内存位置的地址。C中的不同指针类型表示您希望驻留在指针变量引用的内存位置的不同类型。因此,
int*
应该是指可以解释为int
的位置。但是,void*
是一种指针类型,它引用了未指定类型的内存位置。您必须强制转换这样一个void指针,才能访问它所引用的内存位置的数据。这意味着函数返回一个void*
该*表示函数的返回类型,即void*
声明指针变量时,将*
放在变量名称或变量类型附近也是一样的:
int *a;
int* a;
我个人认为第一个选择更清楚,因为如果你想用<代码>、<代码>分隔符定义多个指针,则每次必须重复< <代码> *>代码>:
int *a, *b;
在这种情况下,使用“接近类型语法”可能会产生误导,因为如果您编写:
int* a, b;
您正在声明指向int(a
)和int(b
)的指针
因此,您也可以在函数返回类型中找到该语法 谢谢大家的回答,但是空指针意味着什么呢?它只是指向内存中某个位置的地址。您不知道它指向什么-这取决于您是否将指针转换为一个合适的类型,以便以后使用。当然,将其强制转换为无效类型(例如,假设void*指向一个float,但您将其强制转换为char)将产生未定义的结果。@AldeeMativo:另外,请参阅C中的@DanielKamilKozar。我们不将指针强制转换为void。我们只是简单地分配它们。这就是工作标准化的方式。(和C++不同,它是一个完全不同的野兽)。谢谢你指出这一点。谢天谢地,从那以后我的知识有所提高。:)问编写代码的人为什么在函数名旁边放星号,而不是
void*func\u name
或void*func\u name
,这将是一个非常有趣的问题。如果他们能提出一个合理的论据为什么,我会印象深刻。理性论据:因为我们习惯于写“int*a”,所以对函数做同样的事情似乎更一致。除了纪尧姆写的之外,函数的提交是一个指向void的指针。与int*a
相同,它是指向整数的,而不是整数指针的类型。@Guillaume愚蠢的东西。因为我的老师和你一样思考,我总是对指针感到困惑。为什么我们会首先写int *A,这里就像C++中的声明:[Type ] [Nosi]。一个是“指向int的指针”类型的变量,为什么我们要在空格的另一边放一个星号呢?它与名称无关,它指的是类型,是“指向INT的指针”类型。10年前我问了我的老师一个完全相同的问题,OP写道,“函数名之前的星号到底是什么,它与函数名有什么关系?@Zaibis确切地说是整型指针,但这是正确的说法:a是指向整型指针的类型“如果你想使用,运算符定义多个指针”。这被认为是糟糕的编程风格,因为它在组合相同类型的指针和变量时会导致错误。解决方案不是混淆您声明指针的方式,而是在一行上声明每个变量。不存在在同一行上声明多个变量有意义的情况。您这样做的目的是什么?保存键盘按键?显然,键盘的磨损比代码的可读性更严重……我从来没说过我会这么做。我说过这是一个喜欢“接近变量名”语法的原因,因为它从不造成混淆。我说过,这可能是对函数接口中使用的相同语法的一种解释。如果你想使用,运算符定义多个指针,你必须每次重复*:int*a,*b
在该上下文中,逗号是分隔符,而不是运算符。但为什么要用于函数声明?@pemapmoder,这只是函数的返回类型,在本例中是指向void
的指针。