我目前正在学习C ++,并且遇到了许多以null结尾的字符串。这使我思考,在声明指针时哪种方式更合理:
char* string
或者char *string
? 对我来说,char*格式更有意义,因为"string"的类型是指向字符的指针,而不是字符。然而,我通常看到后一种格式。这同样也适用于引用。
请问是否有逻辑上的原因使用后一种格式?
char* string1, string2;
string1
是一个字符指针,但string2
只是单个字符。因此,声明通常格式化为:
char *string1, string2;
这使得*
仅适用于string1
,而不是string2
。良好的实践是避免在一个声明中声明多个变量,特别是如果其中一些是指针。
char * string1,string2;
解释为两个指针,而且b)星号不是类型说明符本身的修饰符,而是名称的修饰符。将其视为XML:您具有类型属性的声明元素,以及一个或多个带有变量名称的子元素。现在为什么当它仅适用于其第一个子元素时,您会将指针修饰符(*)作为属性添加到类型元素中?话说回来,char *
更易读。 :( - AnorZakenBjarne Stroustrup在他的网站中提到了这个问题:
当人们试图在单个声明中声明多个指针时,会产生关键的混淆:
int* p, p1; // probable error: p1 is not an int*
int* p;
并解释说 ‘p
是指向 int
的指针’,强调类型。事实上,p 的类型是 int*
。我明显更喜欢这种强调方式[...]”。 - Tomáš Zato从技术上讲,编写代码是有意义的
char *f
因为在这里*f
是声明符,而char
是指定所有声明符的基本类型的声明说明符。声明符包含像()
、[]
和&
这样的运算符,可以认为是修改基本类型和实际标识符。
我使用上述形式将*
放到标识符中,因为它强调了*f
实际上是声明符,而char
是基本类型。
在一定程度上,可以认为在应用运算符到标识符时,声明符中的修饰符会使声明说明符中的类型。但这并不总是有效的:
int a, *b, &c = a, d(), e[1], C::*f;
&c
和C::*
之外,所有a
、*b
、d()
和e[1]
都静态解析为int。还没有人提到的是以下内容:
char *string
这也可以被解读为声明表达式 *string
(即指针 string
应用了间接操作符)的类型为 char
。从这个角度来看,这种表示法是非常合理的。
话虽如此,我使用
char * string
我自己 ;)
char* foo, bar;
虽然现在foo的类型是char*,但bar的类型是char。因此许多人更喜欢
char *foo, bar;
为了让这个更清晰明了。
char* foo, bar;
,那么这是读者自己没有足够了解该语言的责任。 - Pulseczar对于大多数用途而言,std::string比char*更好。
我总是将*与类型放在一起,例如char*,因为正如Stroustrup所指出的,这强调了类型。
我从不在一行上声明变量,以避免在此处讨论的常见陷阱。
char* p, q; // oops, probably not what was meant
// this is mandated by our style guide:
char* p;
char* q;
考虑到在一行中可以进行多个声明,对我来说,它更适合属于变量而不是类型,例如:
char *pString, arrString[20];
std::string str
比char *
更可取。DataType * ptr
这样的事情,以使*
更加突出。或者,更常见的是使用std::tr1::smart_ptr<DataType> ptr
,或者可能是一个auto_ptr
。char* foo
”这种说法,因为它将变量类型的所有信息都放在了一个地方。如果“*foo
”部分跨越屏幕一半,那么“char *foo
”可能会让人感到困惑!char
和char*
是不同的类型,所以这种情况在我的代码中不太可能出现。我的答案是:两者都不应该使用,你应该使用:
char * string;
考虑一下,如果C语言的设计者Dennis Ritchie使用关键字“ptr”代替“*”字符,我们就必须这样说:
char ptr string;
并且没有进行这些讨论。
在我看来,它也更易读。
char *
,而不是具有char
类型的名为“*string”的变量。人们直观地解析代码沿着空格边界,因此合理地格式化代码,使其在解析时具有有意义的读取方式。当然,下面的答案解释了为什么有时会使用违反直觉的约定。 - aroth