例如,我通常将int const * const *
向后读作“指向常量整数的常量指针”。为什么C ++不希望它像* const * const int
一样从左到右。如果将语言更改为此样式,是否会导致与其他C ++语言功能的兼容性问题?
我知道像const这样的限定符可以出现在基类型的任何一侧。星号和随后的争用的一面是我真正追求的。
答案 0 :(得分:4)
解释指针语法背后的基本原理最好用Kernighan& amp; Ritchie自己(K& R,第一版,第90页):
int * px;用作助记符:它表示组合* px 是一个int,即如果px出现在上下文* px中它等效于 可以使用int类型。实际上声明的语法 变量模仿变量可以表达的语法 出现。强>
与您假设的反向语法相关的其他评论:
int a,*px, atoi(char*);
这在您的反向语法中是不可能的。 char *s[10]
是一个包含10个指向char的指针的数组。你的反转语法是什么:[10]* char s
? * char s[10]
?如果将第二个维度添加到数组中,它会保持一致吗? char *(*f)(int)
这样的函数指针? 答案 1 :(得分:3)
它最终来自这样一个事实,遗憾的是*
是一个前缀运算符,可能来自B,BCPL等。比较Pascal,其中defererence运算符是^
并且是后缀。如果C *
运算符是后缀:
->
运算符不是必需的:相反,您只需编写ptr*.member
。答案 2 :(得分:2)
它来自C,其中编写类型以模仿具有相同装饰的表达式的值类型。表达式*p
的类型是什么?
答案 3 :(得分:0)
将星号分配给变量。指针不是特殊类型,而是变量的特殊行为。 所以
int *a, b;
意味着,a是指向整数的指针,而b只是整数。 两个整数都是:
int *a, *b;
根据你的建议,这种理解将会消失。但是你可以使用C ++ 11中引入的智能指针。