恒定指向恒定类型

Constant Pointer to Constant Type

本文关键字:类型 定指      更新时间:2023-10-16

我才刚刚开始了解C ,如果这很明显,请原谅我。以下指针有什么区别?

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

对我来说,似乎它们都是恒定的int指针。有区别吗?我什么时候可以使用每种类型的声明?

谢谢:)

  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

此代码无效C ,在大多数情况下甚至都不会编译。您可能对本文感兴趣:const int *,const int *const和int const *?

之间有什么区别

所有三个声明

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

只是编写同一件事的不同方法:(const int)(非const指针)。大多数编译器在代码通过中的声明时都会吹来,因为它不是标准的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对象,具有编译时已知的值)。C 中的大多数" const对象"在数学意义上不是'常数',因为它们在同一程序的不同运行中可能有所不同。它们是在运行时创建的,我们只是告诉编译器,我们以后不会更改它们。另一方面," constexpr"意味着它是一劳永逸的"真实"常数。它总是相同的,因此在编译的二进制代码中进行了硬编码。由于您是初学者,因此将其视为#Define的花哨的C 版本。在您的情况下,您尝试将指针声明为const int为constexpr,但是不会发生这种情况,因为该指针在程序的不同运行中会有所不同,并且无法在编译时确定。

相关文章: