我刚刚开始学习C ++,所以如果这很明显,请原谅我。下面的指针之间有什么区别?
const int i = 42;
constexpr const int *p = &i;
const int const* p2 = &i;
对我来说,似乎它们都是常量int的常量指针。有区别吗?我何时会使用每种类型的声明?
谢谢:)
答案 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,但它不会发生,因为这个指针在程序的不同运行中会有所不同,并且无法在编译时确定。