在功能名称前加星号的功能是什么?


71

我对在大多数C程序上看到的对我来说不熟悉的函数声明感到困惑。

*该功能意味着什么?我对*变量类型()的理解是,它创建了一个指向另一个变量的指针,因此它可以跟踪将后一个变量存储在内存中的地址。但是在这种情况下,我不知道这个*星号意味着什么。


7
询问编写代码的人为什么将星号放在函数名称而不是void* func_nameor旁边将是一个非常有趣的问题void * func_name。如果他们能提出一个合理的理由,我会印象深刻。
伦丁2012年

11
合理的论点:因为我们习惯于编写“ int * a”,所以对函数执行相同的操作似乎更加一致
Guillaume12年

1
除了Guillaume所写的,从函数出来的还有一个指向void的指针。与int *a它相同的是指向整数,而不是a是整数指针类型。
dhein

1
@Guillaume愚蠢的东西。因为我的老师像你一样思考,所以我总是对指针感到困惑。为什么我们首先要编写int * a,就像C ++中的声明一样:[type] [name]a是类型为“指向int的指针”的变量,为什么我们会在空间的另一边放一个星号呢?它与名称无关,它指的是TYPE,一种是“ POINT TO INT”类型。我10年前问过我老师完全一样的问题,那个OP写道,函数名称前的星号是什么,它与函数名称有什么关系?
罗马

@Zaibis的a确实是integer-pointer类型,但这是正确的说法:a的类型是POINTER TO INTEGER
Roman

Answers:


79

星号属于返回类型,而不属于函数名称,即:

这意味着该函数返回一个void指针


18
谢谢你们的回答,但是空指针是什么意思?
Aldee 2012年

10
它只是内存中某个位置的地址。您不知道它指向的是什么-由您决定将指针转换为以后可以使用的正确类型。当然,将其强制转换为无效类型(例如,使void *指向浮点数,但将其强制转换为char)将产生不确定的结果。
Daniel Kamil Kozar 2012年

1
@AldeeMativo:另请参见stackoverflow.com/questions/692564/…–
NPE

9
@DanielKamilKozar在C语言中,我们不会将指针转换为void。我们只需分配它们。这就是标准化的工作方式。(与C ++不同,C ++是完全不同的野兽。)
Jens

@Jens:当然可以。感谢您指出了这一点。幸运的是,自那时以来,我的知识有所提高。:)
Daniel Kamil Kozar 2014年

23

*表示函数的返回类型,即void *

声明指针变量时,*将变量名称或变量类型放在紧邻位置是相同的:

我个人认为首选更为明确,因为如果要使用,分隔符定义多个指针,则*每次都必须重复:

在这种情况下,使用“接近类型语法”可能会产生误导,因为如果您编写:

您正在声明一个指向int(a)和int(b)的指针。

因此,您也会在函数返回类型中找到该语法!


4
“如果要使用,运算符定义多个指针”。这被认为是不良的编程风格,因为在组合相同类型的指针和变量时会导致错误。解决方案不是混淆指针的声明方式,而是在每个变量的一行上声明每个变量。在同一行上声明多个变量是没有道理的。您要这样做是什么,节省键盘按键?显然,键盘的磨损比代码的可读性更为严重……
Lundin 2012年

1
我从没说过要那样做。我说过,这是首选“接近变量名”语法的原因,因为它永远不会造成混淆。我说过,这可能是对函数接口中使用的相同语法的解释。
Vincenzo Pii 2012年

1
if you want to define multiple pointers using the , operator, you will have to repeat the * each time: int *a, *b; 在这种情况下,逗号是分隔符,而不是运算符。
2012年

但是为什么要进行函数声明?
SOFe

@PEMapModder,这只是函数的返回类型,在本例中为的指针void
文森佐·皮

11

*属于返回类型。此函数返回void *,它指向未指定类型的某些内存位置的指针。

指针本身就是一种变量类型,它以某个内存位置的地址作为其值。C中的不同指针类型表示您希望驻留在指针变量所引用的内存位置的不同类型。因此int *,预期a是指可以解释为的位置int。但是avoid *是指向未指定类型的内存位置的指针类型。您将必须强制转换此类void指针,以便能够在其引用的内存位置访问数据。


5

这意味着该函数返回一个void*

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.