如何解决为什么有两种方法可以编写指向常量的指针,而只有一种方法可以编写常量指针?
指向常量的指针可以用以下两种方式编写:
int a = 5;
const int* b = &a;
/* or */
int const* c = &a;
但是常量指针只能这样写:
int a = 5;
int* const b = &a;
// const* int c = &a; This will not compile.
第二行会产生这个错误:
expected identifier or '(' before 'int'
为什么不允许这样做?
解决方法
在C声明中定义如下
declaration:
declaration-specifiers init-declarator-list
例如在这个声明中
const int* b = &a;
const int
是类型说明符,( *b ) = &a
是 init-declarator-list。
你可以像这样重写上面的声明
const int ( *b ) = &a;
如果你想让声明符成为一个常量对象,你应该写
const int ( * const b ) = &a;
你不能像
一样使用类型说明符(除了使用限定符)来分隔声明符const* int c = &a;
即在此记录中,类型说明符 int
拆分声明符 *c
。
另一方面,您可以通过以下方式引入类型说明符
typedef const int *Ptr;
在这种情况下,您可以使声明符保持不变
const Ptr b = &a;
在这种情况下,您将获得与
相同的声明const int * const b = &a;
,
声明说明符可以以任何顺序出现。就风格而言,我们倾向于将存储类说明符放在第一位,然后是类型限定符,然后是类型说明符,如
static const volatile unsigned long int *p;
但编译器不在乎——我们可以把它写成
unsigned long int volatile static const *p;
编译器会对它感到满意(任何阅读和维护您的代码的人都可能不满意)。
*
是 declarator 的一部分,而不是声明说明符 - 无论声明说明符如何排序,它都绑定到 p
。如果我们想将 p
声明为 const
指针,那么我们必须应用 const
关键字作为声明符的一部分。为了防止与声明指向 const
的指针混淆,规则是如果我们使 指针 const
,那么 const
关键字转到 * 运算符的 em>右侧:
const T *p; // p is a pointer to const T
T const *p; // same as above
T * const p; // p is a const pointer to T.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。