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

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

4

4 回答 4

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*形成了一个原子。

于 2012-08-08T12:55:17.560 回答
3

ptr1is aconst (char *)表示指针本身是 const,而ptr2is a(const char) *表示指针的目标是 const。

于 2012-08-08T12:55:53.070 回答
0

它与 c 在内部对事物进行分组的方式有关。typedef 不像宏,它不只是替换其中的东西。如果你要在其中加上括号,它看起来像这样。

const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";
于 2012-08-08T12:56:50.663 回答
0

像这样写:

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

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

于 2012-08-08T13:00:52.377 回答