typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在ptr1
应该是类型const char*
,因此是非常量指针,那么为什么将它视为常量指针?
它们是不相同的。
第一个指定 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
通过使用 typedef typedef char* c
,您可以将“指向 char 的指针”的含义打包到一个别名中c
:
const c p; // p is a const [c] --> p is a const [pointer to char]
补充说明:
Typedef 不像宏那样就地扩展,即
const c p;
真的变成
const [char*] p;
它不会变成
const char* p; // Nope.
不要在你的脑海中像宏一样扩展它,使用 typedef,你已经绑定在一起char
并*
形成了一个原子。
ptr1
is aconst (char *)
表示指针本身是 const,而ptr2
is a(const char) *
表示指针的目标是 const。
它与 c 在内部对事物进行分组的方式有关。typedef 不像宏,它不只是替换其中的东西。如果你要在其中加上括号,它看起来像这样。
const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";
像这样写:
typedef char* c;
c const ptr1 = "pointer";
++ptr1; /// error
char const* ptr2 = "pointer";
++ptr2; /// runs fine
使差异更加明显,这应该与您的示例相同