为什么{typedef int * PTR; const PTR p =#}不等于“const int * p =& num”而是“int * const p =& num”?

时间:2013-05-09 13:04:34

标签: c pointers constants typedef

这个问题在另一个关于SO的问题中被部分触及,但有些随意,因为它不是主要问题。由于我的困惑仍然存在,我将其置于一个单独的问题中。

为什么以下两个语句相当于int* const p=&num而不是const int* p=&num,后者似乎更符合逻辑和直观? typedef这种行为的严格原因是什么?

typedef int* PTR;
const PTR p=#

最后,在这个问题中,一位成员评论说使用typedef ed指针是不好的做法。但我已经看到它被广泛用于许多书籍和网站,这似乎是一件很方便的事情。它使代码更容易理解。那么最后一句话是什么呢?应该尽可能避免使用typedef指针吗?

编辑:如果我们打算执行以下操作,那么typedef语句的正确语法是什么:

  const int* const p=#

编辑:我无意中忘了问一件重要的事情。对于以下内容,使用typedef语句的正确语法是什么?

  const int* p=#      //instead of the int* const p=&num that we got

2 个答案:

答案 0 :(得分:4)

通常,

const TYPE var = ini;

声明类型为const的{​​{1}}变量var。所以

TYPE

声明类型为const PTR p=# 的{​​{1}}变量const,并使用p的地址进行初始化。

PTR不是文字别名,因此您不能将num ed name替换为其扩展名,以查看其结果。

如果你想获得

typedef

typedef,您必须const int* const p=# 包括typedef在内的某些内容,例如

typedef

然后你可以写

const int

(但不要,这很丑)。

typedef const int *CI_ptr;
然后你可以写

const CI_ptr p = #
  

最后,在这个问题中,一位成员评论说使用const int *p = # 指针是不好的做法。但我看到它被广泛用于许多书籍和网站,看起来很方便,这使得代码更容易理解。

是否使代码更容易理解或更少取决于。根据我的经验,有一件事总是一件坏事,就是CI_ptr p = # 指向名称的指针类型隐藏了你正在处理指针的事实。

typedef
例如,一个不幸的是常见的滥用。当您读取类型typedef时,您不会怀疑它是指针。至少将其定义为typedef struct list_node { int value; struct list_node next; } *node; 。但是,为什么node指针,node_ptr结构并使用typedef更短更清晰。

  

那么关于它的最后一句话是什么?应该尽可能避免使用typedef指针吗?

它没有最终权威,所以这主要是你的决定。如果有的话,请遵循公司/项目中的编码风格,如果您自己编码,请使用您的判断。

答案 1 :(得分:0)

这是将typedef用于对象指针类型的问题之一。

限定符(constvolatile)永远不会穿透typedef

这是一些编码标准禁止将typedef用于对象指针类型的原因之一。