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

时间:2012-08-08 12:53:20

标签: c pointers const

typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine

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

4 个答案:

答案 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)

ptr1const (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

使差异更明显,这应该与您的示例相同