微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么有两种方法可以编写指向常量的指针,而只有一种方法可以编写常量指针?

如何解决为什么有两种方法可以编写指向常量的指针,而只有一种方法可以编写常量指针?

指向常量的指针可以用以下两种方式编写:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?