【发布时间】:2012-08-08 12:53:20
【问题描述】:
typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在ptr1 应该是const char* 类型,因此是一个非常量指针,那么为什么它被视为一个常量指针呢?
【问题讨论】:
typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在ptr1 应该是const char* 类型,因此是一个非常量指针,那么为什么它被视为一个常量指针呢?
【问题讨论】:
它们不一样。
第一个指定一个const-pointer-to-char,第二个是一个point-to-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
使差异更加明显,这应该与您的示例相同
【讨论】: