首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向常量类型的常量指针

指向常量类型的常量指针
EN

Stack Overflow用户
提问于 2017-03-09 02:16:00
回答 2查看 112关注 0票数 0

我刚刚开始学习C++,如果这是显而易见的,请原谅我。下面的指针有什么区别?

代码语言:javascript
复制
const int i = 42;
constexpr const int *p = &i;
const int const* p2 = &i;

对我来说,它们似乎都是指向一个常量int的常量指针。有什么不同吗?我什么时候可以使用每种类型的声明?

谢谢:)

EN

回答 2

Stack Overflow用户

发布于 2017-03-09 02:36:20

代码语言:javascript
复制
  1)Meaning of constexpr int *p = &i;
    p is const: it cannot be reassigned
    i can be modified through p

  2)Meaning of const int *p2 = &i; 
    p2 is non-const: it can be reassigned to point to a different int
    i cannot be modified through p2 without use of a cast
票数 0
EN

Stack Overflow用户

发布于 2017-03-09 03:02:27

这段代码是无效的C++,在大多数情况下甚至不会编译。您可能对这篇文章感兴趣:What is the difference between const int*, const int * const, and int const *?

所有三个声明

代码语言:javascript
复制
const int const* p2 = &i;
const int * p2 = &i;
int const* p2 = &i;

只是写同样的东西的不同方式:一个(非常数指针)到(常量int)。大多数编译器在声明它时都会停顿,因为它不是一个标准的C++,而且可能是一个错误。

你将能够写

代码语言:javascript
复制
p2 = p3; // assign value of (pointer p3) to (pointer p2)

因为(指针)不是常量,但不是

代码语言:javascript
复制
*p2 = *p3; // assign (object) pointed by (pointer p3) to (object) pointed by (pointer p2)

因为指针指向的(对象)是const (本例中为const int )

但如果你愿意写

代码语言:javascript
复制
int * const p2 = &i;

然后它将是一个指向(int)对象的(const指针)。那么事情就会完全相反:

代码语言:javascript
复制
p2 = p3; // don't work
*p2 = *p3; // work!

您也可以编写const int * const来禁止这两个选项,或者不使用const来允许这两个选项。

Constexpr是一个非常不同的关键字。它并不是简单地说它是一个(const对象),而是说它是一个(在编译时已知值的const对象)。C++中的大多数“常量对象”不是数学意义上的“常量”,因为在同一个程序的不同运行中,它们可能是不同的。它们是在运行时创建的,我们只需告诉编译器我们以后不会更改它们。另一方面,'constexpr‘意味着它是一个一次性定义的’真实‘常量。它总是一样的,因此它被硬编码成编译过的二进制代码。由于您是初学者,因此可以将其视为#define的一个花哨的C++版本。在本例中,您试图将一个指向const int的指针声明为constexpr,但这不会发生,因为该指针在程序的不同运行时会有所不同,并且不能在编译时确定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42678886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档