【问题标题】:Pointers and const in C++C++ 中的指针和常量
【发布时间】:2013-11-14 01:34:46
【问题描述】:

在处理指针和 const 时,我看到有三种声明它们的方法:

1)

int nValue = 5;
int *const pnPtr = &nValue;

2)

int nValue = 5;
const int *pnPtr = &nValue;

3)

const int 5;
const int *const pnPtr = &nValue;

示例 1 称为“指向非 const 的常量指针”。地址不能改变,但值可以改变。因此我们可以执行以下操作,因为示例 1 中的 nValue 是一个非常量 int:

int nValue = 5;
int const *pnPtr = &nValue;

*pnPtr = 6; 

但我们不能在示例 1 中执行以下操作:

int nValue = 5;
int nValue2 = 6;
int const *pnPtr = &nValue;
pnPtr = &nValue2; 

示例 2 被称为“指向 const 的指针”。这意味着地址可以更改,但值不能更改。我们可以做到以下几点:

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
pnPtr = &nValue2;

但我们不能在示例 2 中执行以下操作:

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
*pnPtr = nValue2;

示例 3 是一个“指向 const 的常量指针”。这意味着地址或值都不能改变:

const int nValue;
const int *const pnPtr = &nValue;  

我的问题与第二个例子有关。当 nValue 不是 const 时,为什么第二个示例称为“指向 const 的指针”。这是一个常规的 int 声明。另外,在第二个例子中,如果我们给它分配另一个地址,那个地址有不同的值,我们不能只尊重那个地址,因此返回不同的值吗?这不会破坏整个目的吗?

【问题讨论】:

  • 有 4 种方式来声明指针,参见 Dietmar Kuhl 的回答。

标签: c++ constants


【解决方案1】:

第二个示例中的const 适用于int,即您有一个指向const int 的非const 指针。由于 C 和 C++ 中的类型是从右到左读取的,因此实际上最简单的方法是将 const 始终放在右侧。也是唯一可以统一放置的地方:

int i(0);
int      *       p0(&i); // non-const pointer to non-const int
int const*       p1(&i); // non-const pointer to const int
int      * const p2(&i); // const pointer to non-const int
int const* const p3(&i); // const pointer to const int

也就是说,您可以将const 应用于指针(p0p1 可以更改,但p2p3 不能)以及指针指向的实体(*p0*p2 可以更改,但*p1*p3 不能更改)。对于第二行和第四行,您可以交换 intconst,但我不建议这样做。

【讨论】:

    【解决方案2】:

    在 C 中,整数不是常量,但我们在处理常量整数时声明了指针。在这种情况下,C 在将其引用分配给指针时将该整数隐式转换为常量。

    通常我们在将一些值传递给函数时这样做,这样可以避免一些意外的变化。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2020-10-23
      • 2021-10-02
      • 2013-01-04
      • 2022-07-06
      • 1970-01-01
      • 2012-09-14
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多