经典C中的float * varname和float * varname有什么区别?
答案 0 :(得分:22)
格式。而已。他们的意思是一样的。
你放置空间的地方(或者如果你真的有空间)是一个偏好的问题。有些人更喜欢varname旁边的*,这样你就不会被类似的东西搞糊涂了。
float* a, b;
(这里,只有a是指针,b不是)
其他人认为他们从不一次声明多个变量,因此他们更喜欢浮动旁边的*,因为它是该类型的一部分。
答案 1 :(得分:8)
没有区别。空格完全被忽略了。
但请注意以下内容可能会产生误导:
float* var1, var2;
对上述内容的随意检查会让您认为var1和var2都是浮点数的指针。但是你错了,因为这会将var1声明为指向float的指针,但var2将是一个常规浮点数。
答案 2 :(得分:4)
后者更明确,因为它表明您正在创建一个变量,该变量是指向float的指针,而不是创建一个浮点指针变量。这在以下构造中变得很重要:
float *foo, bar;
foo是指向float的指针,但bar只是一个浮点数。
答案 3 :(得分:1)
大多数情况下,这是编码风格的问题。但是,大多数C程序员更喜欢使用第二个选项:float *var;
,因为它更接近语言语法如何绑定*
星号:*
绑定到声明符,而不是说明符类型。
换句话说,C程序员翻译float *var
,因为*var
属于float类型。但var
的类型不是float*
。
维基百科文章C variable types and declarations
中有更详细的解释此外,您可能会发现问题C Pointer Syntax: Style poll正在进行中。
答案 4 :(得分:0)
正如其他人所说,它没有任何区别 - 风格问题。请注意,在C ++中,习惯上写:
type* var;
因为指针是类型的一部分 - 至少对于自定义类型是如此。但也可以扩展内置类型。因此,在C中做同样的事情以保持一致是有道理的。我个人觉得这个类型的指针部分更直观。
答案 5 :(得分:0)
实际上没有区别;声明被解析为,就像它被写为float (*varname);
一样。
在C和C ++中,声明都以表达式为中心,而不是对象;基本上,声明的形式应该与可执行代码中的表达式的形式相匹配(IOW,声明模仿使用)。例如,如果您有一个指向名为p
的整数的指针,并且您想要访问p
指向的整数值,则取消引用指针,如下所示:
x = *p;
表达式的类型 *p
是int;因此,声明应该看起来像
int *p;
类似地,如果你有一个名为arr
的int数组,并且你想要访问特定元素i
的整数值,你会写
x = a[i];
表达式的类型 a[i]
是int;因此,声明应该看起来像
int a[N];
在上面的示例中,*p
和a[N]
被称为声明者;声明符引入了声明的对象的名称以及类型说明符中未提供的其他类型信息。 p
和a
的内容由类型说明符int
提供,但是p
的指针和{{1}的数组 - ness }由各自的声明符提供。
这是一个重点,需要强调的一点;无论空格如何,a
和*
的{{1}}都绑定到声明符,而不是类型说明符。您可以用任何一种方式编写它的事实是C(和C ++)语法的意外,因此有一种思想认为指针变量应该声明为int *p;
而不是int* p;
,因为T* p;
的类型是“指向T的指针”。我的问题是推理只适用于简单的指针类型;我们不能以相同的方式处理数组或函数类型。例如,即使T *p;
的类型是“N元素数组int”,我们也无法编写p
。当我们开始声明指向数组,指向函数或其组合的指针时,它真的会崩溃。例如:
int[N] arr;
arr
的类型是“指向函数的指针,该函数返回指向返回指向int的指针的函数的指针的N元素数组的指针”。除“int”之外的所有内容都是声明者的一部分;写int *(*(*(*farr)())[N])();
甚至farr
只会......愚蠢。
我认为坚持为指针声明编写int* (*(*(*farr)())[N])();
会导致更多的混淆,而不是更少。就像Stroustrup和大批C ++程序员想要假装的那样,C和C ++中的声明都以表达式为中心,而不是对象。
由于我是一个编写C ++代码的大型团队的成员,我遵循商定的编码指南,包括将指针和引用声明为int*(*(*(* farr)())[N])();
和T* p;
,但它让我磨牙每次我都要这样做。