int* i和int *i之间的区别

44

我正在将一个用C语言写的DLL的头文件转换成Delphi格式,以便我可以使用这个DLL。

我的问题是什么是下列两者之间的区别:

int* i

int *i

我将第一个转换为

i: PInteger;

但是我不确定在Delphi中第二种的正确转换方式。

据我理解,第一种是一个简单的类型指针。第二种是一个指针变量,但我不确定它们之间的区别。


9个回答

71

就C语言而言,它们都能实现同样的功能,这只是个人喜好问题。int* i清晰地表示这是一个指向整数类型的指针。而int *i则表明星号(*)只影响单个变量。因此,int *i, jint* i, j都会创建i作为整数指针,j作为整数。


1
我觉得我其实早就知道这个,但是已经有10年没有写C/C++代码了。 - Mike Taylor
你不喜欢那些语言的怪癖吗 :-) 我很高兴我已经完全忘记了,但是看到它在某个地方得到高评价还是很好的。 - Jeroen Wiert Pluimers

40

int* iint *i 是完全等价的。


因此,DLL头文件的差异可能是由于缺乏一致性或打字错误引起的。谢谢。 - Mike Taylor
如果你要花时间感谢那个人,你能不能也接受他的答案呢? - Steve M
22
抱歉,由于问题被迅速回答,我无法立即接受答案。我收到了一条消息,告诉我我只能在11分钟后接受答案。 - Mike Taylor
8
此外,这也是 Stack Overflow 社区的一大担忧:当您接受一个答案后,人们便停止查看这个问题。我已经注意到这种情况多次了。如果我提出一个问题,并将其保持开放状态一段时间,许多人会查看它,其中几个人会尝试回答它。如果我很早就得到了一个不错的答案并接受了它,那么查看者数量会急剧下降。此外,回答的数量也会突然停止,因此可能还有更好的答案永远不会浮现。值得深思… - Svein Bringsli

20

它们是相同的。这两种不同的样式来自于C语法中的一个怪癖。

有些人喜欢使用int* i;,因为int*是i的类型。

其他人喜欢使用int *i;,因为解析器将星号附加到变量而不是类型。只有在尝试在一行上定义两个变量时,这才变得有意义。无论你如何编写它:

 int* i,j;
 int*i,j;
 int *i,j;

在这些示例中,i 是指向整数的指针,而 j 只是一个整数。最后一种语法更清晰,不过更好的方式是:

 int j, *i;

或者更好的是:

 int *i;
 int j;

16

在C语法中,你可以写成int *i,或者int* i,甚至是int * i都是可以的。它们都被解析为int (*i);也就是说,*与声明符绑定,而不是类型说明符。这意味着在像下面这样的声明中:

int* i, j;

只有i被声明为指针;j被声明为常规整数。如果您想将它们都声明为指针,您需要编写:

int *i, *j;

大多数C程序员使用T *p而不是T* p,因为a)在C中,声明是以表达式为中心而不是以对象为中心的,b)它更接近于声明语法。
举个例子来说明我所说的以表达式为中心,假设您有一个指向int的指针数组,并且您想获取元素i处的整数值。 对应于该值的表达式是*a [i] ,并且表达式的类型是int ; 因此,数组的声明是:
int *a[N];

当你在C编程中看到“声明模拟使用”的短语时,它的意思是这样的。

4

没有区别。如果你愿意可以将其打成int * i,它们的含义都是一样的:"i是一个指向整数的指针"。


3
"

int* iint * iint*iint *i都是完全等效的。这源于C编译器(以及其兼容的类C系统)在解析源代码期间生成的标记流中忽略空格。

有些人喜欢使用int* i,认为这可以使代码更清晰(因为指针指示符被视为类型的一部分)。有些人喜欢使用int *i,认为这可以使代码更清晰(因为类型是int,并且他们有一个“i指针”指向它)。在编译器运行源代码后,这两种技术实际上并没有任何不同。如果不确定,模仿现有的风格即可。

"

2

这是同样的事情。

有些开发者更喜欢使用int* i的表示方式,因为这样i的类型清晰明确,即"指向int的指针",而int *i则看起来不太易读。


1
我很好奇你为什么认为后者不够易读?谢谢。 - johnny

0

与以下不同:

  1. 当你想在一行上声明多个指针而不必每次都写*时,可以使用 int* a,b,c,d; 这里,a、b、c、d都是指向整数的指针。

  2. 当你想在一行上声明一个指针和一个普通变量时,必须使用 int *a,*b,c,d; 这里,a和b是指向整数的指针,c和d是整数变量。


这里,“a,b,c,d”都将是指向整数的指针是错误的,只有变量'a'是指针。因此,最好把星号放在变量名之前而不是数据类型旁边,以避免混淆。 - SimoX

0
上面提到的情况强调了“Type *”最有意义的情况。
但是我个人发现,“Type*”在传递指针类型的引用时更具直观性/可读性。对于初学者来说,当阅读变量时,以下变量是非直观的:
int *&x; // 这里的x是什么?
相比之下:
int* (&x); // 一个 int* 类型的引用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接