typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在
ptr1
应该是 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
是一个const (char *)
,意味着指针本身是一个const,而ptr2
是一个(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
使差异更加明显,这应该与您的示例相同
您需要为
typedef
变量创建一个新的 const
,如下所示:
typedef char* c;
typedef const char* const_c;
const_c ptr1 = "pointer";
++ptr1; /// runs fine
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在 ptr1 和 ptr2 的工作方式相同,包括隐式转换!