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

Rüp*_*ure 5 c pointers typedef constants

这件事在 SO 的另一个问题中部分提到,但有点随意,因为这不是主要问题。由于我的困惑仍然存在,我将其放在一个单独的问题中。

为什么下面两个陈述相当于int* const p=&num而不是const int* p=&num后者看起来更符合逻辑和直观?造成这种行为的严格原因是什么typedef

typedef int* PTR;
const PTR p=#
Run Code Online (Sandbox Code Playgroud)

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

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

  const int* const p=#
Run Code Online (Sandbox Code Playgroud)

编辑:我无意中忘记问一件重要的事情。typedef那么使用该语句进行以下操作的正确语法是什么?

  const int* p=#      //instead of the int* const p=&num that we got
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 4

一般来说,

const TYPE var = ini;
Run Code Online (Sandbox Code Playgroud)

声明一个类型为 的const变量。所以varTYPE

const PTR p=#
Run Code Online (Sandbox Code Playgroud)

声明一个类型为 的const变量,并使用 的地址进行初始化。pPTRnum

Atypedef不是文本别名,因此您不能仅用typedef其扩展替换 ed 名称来查看其结果。

如果你想得到

const int* const p=#
Run Code Online (Sandbox Code Playgroud)

对于 a typedef,您必须typedef包括const int,例如

typedef const int *CI_ptr;
Run Code Online (Sandbox Code Playgroud)

然后你可以写

const CI_ptr p = #
Run Code Online (Sandbox Code Playgroud)

(但不要这样做,这很丑)。

而对于

const int *p = #
Run Code Online (Sandbox Code Playgroud)

然后你可以写

CI_ptr p = #
Run Code Online (Sandbox Code Playgroud)

最后,在这个问题中,一位成员评论说使用typedefed 指针是不好的做法。但我看到它在许多书籍和网站中被广泛使用,并且似乎是一件方便的事情,这使得代码更容易理解。

它是否使代码更容易理解或更少取决于。根据我的经验,一件事始终是一件坏事,那就是将typedef指针类型指向隐藏了您正在处理指针这一事实的名称。

typedef struct list_node {
    int value;
    struct list_node next;
} *node;
Run Code Online (Sandbox Code Playgroud)

例如,不幸的是,这是一种常见的滥用行为。当您阅读 type 时node,您不会怀疑它是一个指针。至少将其 typedef 为node_ptr. 但是,为什么typedef指针、typedef结构和使用node*更短、更清晰。

那么最终的结论是什么?是否应该typedef尽可能避免使用 ed 指针?

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