typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine
现在ptr1
应该是const char*
类型,因此是一个非常量指针,那为什么它被视为常量指针?
答案 0 :(得分: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
通过使用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
和*
绑定在一起并形成一个原子。
答案 1 :(得分:3)
ptr1
是const (char *)
,意味着指针本身是const,而ptr2
是(const char) *
,意味着指针的目标是const。
答案 2 :(得分:0)
它与c内部分组的方式有关。一个typedef不像一个宏,它不只是替代它。如果你在它中使用pus括号将会是这样的。
const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";
答案 3 :(得分:0)
写得像:
typedef char* c;
c const ptr1 = "pointer";
++ptr1; /// error
char const* ptr2 = "pointer";
++ptr2; /// runs fine
使差异更明显,这应该与您的示例相同