为什么在使用typedef时非const指针被视为const?

cir*_*mbo 6 c pointers const

typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
Run Code Online (Sandbox Code Playgroud)

现在ptr1应该是类型const char*,因此是非const指针,那么为什么它被视为常量指针?

Seb*_*ach 13

他们不一样.

第一个指定const-pointer-to-char,第二个是指向const-char的指针.

尝试从右到左阅读:

const char *p;  // p is a pointer to char which is const
char const *p;  // p is a pointer to const char (same as previous)
char * const p; // p is a const pointer to char
char const * const p; // p is a const pointer to const char
Run Code Online (Sandbox Code Playgroud)

通过使用typedef,typedef char* c您可以将"指向char的指针"包含在一个别名中c:

const c p; // p is a const [c] --> p is a const [pointer to char]
Run Code Online (Sandbox Code Playgroud)

补充说明:

Typedef不像宏那样就地扩展,即

const c p;
Run Code Online (Sandbox Code Playgroud)

真的变成了

const [char*] p;
Run Code Online (Sandbox Code Playgroud)

它并没有成为

const char* p; // Nope.
Run Code Online (Sandbox Code Playgroud)

不要展开它就像在你的心中宏,与类型定义,你必然char*在一起,形成一个原子.

  • 由于这个原因,我养成了编写*type*const的习惯,但它似乎驱使其他程序员(对语言没有很好掌握)疯狂.我实际上认为标准应该规定将const放在前面以便过时并最终取缔它. (2认同)