常量类型的常量指针

时间:2017-03-08 18:16:00

标签: c++ pointers

我刚刚开始学习C ++,所以如果这很明显,请原谅我。下面的指针之间有什么区别?

const int i = 42;
constexpr const int *p = &i;
const int const* p2 = &i;

对我来说,似乎它们都是常量int的常量指针。有区别吗?我何时会使用每种类型的声明?

谢谢:)

2 个答案:

答案 0 :(得分:0)

  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

答案 1 :(得分:0)

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

所有三个声明

const int const* p2 = &i;
const int * p2 = &i;
int const* p2 = &i;

只是编写相同内容的不同方法:a(非const指针)到(const int)。大多数编译器都会在代码中声明它们,因为它不是标准的C ++和可能的错误。

你可以写

p2 = p3; // assign value of (pointer p3) to (pointer p2)

因为(指针)不是const,而不是

*p2 = *p3; // assign (object) pointed by (pointer p3) to (object) pointed by (pointer p2)

因为指针指向的(对象)是const(在这种情况下是const int)

但如果你要写

int * const p2 = &i;

然后它将成为指向(int)对象的(const指针)。事情将完全相反:

p2 = p3; // don't work
*p2 = *p3; // work!

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

Constexpr是一个非常不同的关键字。它不是说它只是一个(const对象),而是说它是一个(在编译时已知值的const对象)。大多数" const对象"在C ++中不是常数'在数学意义上,因为它们可能在同一程序的不同运行中有所不同。它们是在运行时创建的,我们只告诉编译器我们以后不会更改它们。另一方面,' constexpr'意味着它是一个真实的'常量,一劳永逸地定义。它始终是相同的,因此它在编译的二进制代码中得到硬编码。由于您是初学者,请将其视为#define的奇特C ++版本。在你的情况下,你试图将一个指向const int的指针声明为constexpr,但它不会发生,因为这个指针在程序的不同运行中会有所不同,并且无法在编译时确定。