C int*i和int*i之间的差异
我正在将用C编写的DLL的头文件转换为Delphi,以便使用该DLL 我的问题是两者之间的区别是什么C int*i和int*i之间的差异,c,delphi,C,Delphi,我正在将用C编写的DLL的头文件转换为Delphi,以便使用该DLL 我的问题是两者之间的区别是什么 int* i 及 我将第一个转换为 i: PInteger; 但是我不确定Delphi中第二个的正确转换是什么 据我所知,第一个是一个简单的类型指针。 第二个是指针变量。但是我不确定区别是什么。int*i和int*i是完全等效的没有区别。如果需要,可以将其键入int*i;它们的意思都是一样的:“i是指向int的指针。”就C而言,它们都做同样的事情。这是一个偏好的问题int*i清楚地表明它是一
int* i
及
我将第一个转换为
i: PInteger;
但是我不确定Delphi中第二个的正确转换是什么
据我所知,第一个是一个简单的类型指针。
第二个是指针变量。但是我不确定区别是什么。
int*i
和int*i
是完全等效的没有区别。如果需要,可以将其键入int*i
;它们的意思都是一样的:“i是指向int的指针。”就C而言,它们都做同样的事情。这是一个偏好的问题int*i
清楚地表明它是一种int指针类型int*i
显示星号仅影响单个变量的事实。所以int*i,j
和int*i,j
都会创建i
作为int指针和j
作为int指针。这是一样的
一些开发人员更喜欢
int*i
符号,因为这样i的类型显然是“指向int的指针”,而int*i
似乎不太可读。int*i
,int*i
,int*i
和int*i
都是完全等效的。这源于C编译器(及其兼容的C类系统)忽略了在解析源代码过程中生成的令牌流中的空白
有些人更喜欢使用
int*i
,认为这会使代码更干净(因为指针指令在他们心目中被视为类型的一部分)。有些人更喜欢使用int*i
认为这样可以使代码更干净(因为类型是int,他们有一个指向它的“i指针”)。在编译器运行源代码之后,这两种技术实际上都没有做任何不同的事情。当有疑问时,模仿现有样式。它们是相同的。这两种不同的风格来自C语法中的一个怪癖
有些人更喜欢int*i因为int*
是i的类型
其他人更喜欢int*i因为解析器将星号附加到变量,而不是类型。只有当您尝试在行上定义两个变量时,这才有意义。不管你怎么写:
int* i,j;
int*i,j;
int *i,j;
在每一种情况下,i
都是指向int的指针,而j只是int。最后一种语法更清楚,不过更好的是:
int j, *i;
或者最好是:
int *i;
int j;
您可以编写int*i
或int*i
甚至int*i
,这是C语法的一个意外。它们都被解析为int(*i)
;照此,*
绑定到声明符,而不是类型说明符。这意味着
int* i, j;
只有i
被声明为指针j
声明为常规int。如果要将它们都声明为指针,则必须编写
int *i, *j;
大多数C程序员使用T*p
而不是T*p
,因为a)C中的声明是以表达式为中心的,而不是以对象为中心的,b)它更能反映声明语法
作为我所说的以表达式为中心的示例,假设您有一个指向int的指针数组,并且希望在元素I
处获取整数值。与该值对应的表达式是*a[i]
,表达式的类型是int
;因此,数组的声明是
int *a[N];
当您看到关于C编程的短语“声明模仿使用”时,这就是它的意思 上述要点突出了“类型*”最有意义的情况
但我个人认为“Type*”更直观/可读性更强的情况是,将引用传递给指针类型。对于初学者来说,将变量解读为以下内容是不直观的:
int*&x;//这里的x是什么?
与之相反:
int*(&x);//对int*类型的引用
,因此DLL头中的差异是缺乏一致性或键入错误。谢谢如果你要花时间感谢那家伙,你也能接受他的回答吗?对不起,我不能马上接受答案,因为问题回答得太快了。我收到一条消息,告诉我我也只能在11分钟内接受答案,这也引起了人们的关注:当你接受一个问题的答案时,人们就不再看这个问题了。我已经注意到好几次了。如果我问一个问题,并让它开放一段时间,许多人会看到它,一些人会试图回答它。如果我一开始就得到一个像样的答案并接受它,观众数量就会急剧下降。答案也会突然停止,所以也许有更好的答案来回答这个永远不会浮出水面的问题。值得思考的是……我想我其实已经知道了这一点,但自从我做任何C/C++编码以来已经超过10年了。难道你不喜欢这些语言怪癖:-)我很高兴我已经完全忘记了这一点,但很高兴看到它在某个高评级的地方被注意到。可能是重复的,我很好奇为什么你认为后者可读性较差?谢谢
int *a[N];