为什么在使用 typedef 时将非常量指针视为 const?

问题描述 投票:0回答:5
typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine

现在

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

c pointers constants
5个回答
13
投票

它们不一样。

第一个指定一个常量字符指针,第二个指定一个常量字符指针。

尝试从右向左阅读:

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
*
绑定在一起并形成了一个原子。


3
投票

ptr1
是一个
const (char *)
,意味着指针本身是一个const,而
ptr2
是一个
(const char) *
,意味着指针的目标是const。


0
投票

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

const (char*) ptr1 = "pointer";
(const char)* ptr2 = "pointer";

0
投票

写成这样:

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

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


0
投票

您需要为

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 的工作方式相同,包括隐式转换!

© www.soinside.com 2019 - 2024. All rights reserved.