c的语言设计者是否有理由使用星号来定义指针类型
int* x;
并取消引用指针?
int y = *x;
对两个不同的东西使用相同的字符似乎令人困惑,特别是因为它们总是在相同的上下文中使用。
答案 0 :(得分:7)
Brian Bi对Quora这个主题有一个很好的答案。我在这里逐字复制。 http://www.quora.com/C-programming-language/Why-doesnt-C-use-better-notation-for-pointers
在声明指针和指针时使用星号的事实 取消引用指针时不使用星号 C中的可用性故障是故意的。
还有另外两种符号可以这样工作。你用方块 声明数组时括号,并在使用方括号时 访问一个数组。在声明函数时使用括号 指针,并在调用函数指针时使用括号。
声明随后使用。
考虑以下声明:int * a;这个宣言告诉你 * a的类型为int。换句话说,a是指向int的指针。
这个怎么样:int * a [10];这个声明告诉你* a [i] (其中i介于0和9之间,包括在内)的类型为int。从阵列 这告诉我,索引具有比指针解除引用更高的优先级 那你是一个可以使用[]的东西(即数组),那么 使用* on(即指针)......结果你会得到一个int。在 换句话说,a是指向int的指针的数组[10]。
int(* a)[10];该声明告诉您(* a)[i]的类型为int。 由于a是可以使用*的东西,它必须是指针。然后 你可以在结果上使用[]来得到一个int。所以我们看到了那种类型 a必须是指向int的数组[10]的指针。
请注意,上述两个声明仅在括号中有所不同!但 你不必记住每种类型的括号应该去哪里 你可能想宣布。写下你将如何使用变量, 并在开头拍打最后一个类型,就像上面两个一样 例子。出于优先原因必须插入的任何括号, 也包括在宣言中。
很多C程序员都无法记住如何声明函数 指针。当你记住这个宣言时,这也变得容易了 跟随使用。例如,让我们声明一个函数指针 可以用来保存函数strcpy的地址。这个变量是 为了使用,您首先取消引用(使用),然后 call,using(),其中括号包含两个参数;首先 是char ,第二个是char char *。结果是一个char *。
让我们调用我们的函数指针p。我们做的第一件事是 取消引用,所以我们写下来* p。然后我们用参数调用 p char 和const char *,所以将它们写在* p旁边的括号中: ( p)(char ,const char *)。 ( p周围需要括号 因为函数调用的优先级高于解除引用的优先级。) 最后,添加使用结果,即char 功能返回。所以我们的声明是:char *( p)(char ,const 字符*);
const是一个特例。声明中的关键字const适用于 如果你只是部分使用变量,你会有什么东西, 但是一旦你“接近”它就停止。这意味着那件特别的事情 无法改变。
现在,我确定你知道const char * s;声明指向 恒定的字符。这是有道理的,因为一开始就是 const char,即* s的结果是一个const char。但是,你可以 也以char const * s;形式写出来。解释是这样的 我们可以“获得”到* s,然后我们看到单词const,所以它意味着 我们到目前为止所做的是const。忽略const为a 那一刻,我们看到了char。所以* s是一个char,它也是const因为 字const先于* s。
那么char * const s怎么样?这意味着指向char的const指针。该 指针不能改变,但它指向的东西可以。这是 因为关键字const直接出现在s之前,所以它“就在于 解除引用运算符的方式,可以这么说.s在它之前是const 被解除引用,但* s不是常量。声明char const * const s;或const char * const s;指向const char的const const指针。
对于双(和更高)指针,它是相同的交易。 const char ** p; 声明指向const char的指针,char const ** p;也是如此。 但是,char * const * p;声明指向char的const指针, 和char ** const p; delcares指向char的指针的const指针。
请记住,声明遵循使用,你将永远不会 再次被声明语法搞糊涂了。