为什么使用*表示法来定义指针和取消引用?

时间:2014-03-30 04:24:56

标签: c notation

c的语言设计者是否有理由使用星号来定义指针类型

int* x;

并取消引用指针?

int y = *x;

对两个不同的东西使用相同的字符似乎令人困惑,特别是因为它们总是在相同的上下文中使用。

1 个答案:

答案 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指针。

     

请记住,声明遵循使用,你将永远不会   再次被声明语法搞糊涂了。