尝试修改const引用

时间:2014-09-09 11:59:15

标签: c++ pointers casting

我和同事发生了争执。 一旦我尝试修改常量引用。

代码示例如下:

#include <cstdio>
#include <cstdlib>

using namespace std;

int main(int argc, char const *argv[])
{
   const int* A = NULL;

   printf("A = %p\n", A);

   int** pA = const_cast<int**>(&A);

   *pA = new int(5);

   if (pA != NULL)
      printf("pA = %p, value = %d\n", pA, *pA);
   else
      printf("pA null pointer\n");

   if (A != NULL)
      printf("A = %p, value = %d\n", A, *A);
   else
      printf("A null pointer\n");

   return 0;
}

一切正常,日志

 A = 00000000
 pA = 0028FED8, value = 4068760
 A = 003E1598, value = 5

我认为它的工作原理如下:

  1. 我创建一个const指针变量A,其中'0'(零)值是堆栈。它是局部变量,占用堆栈中的4个字节的内存。

  2. 然后我创建了一个指向变量的指针,我抛弃了常量修改并获取变量的地址

  3. 我认为这段代码运行正常,不会导致错误。但我需要某种解释。我对吗?

1 个答案:

答案 0 :(得分:3)

const int *aint * const a不同。

案例1

const]

上使用[*a

此处a是常量。 a指向的地址可以更改。

const int *a = malloc(sizeof (int));
if (a)
{
  //*a = 10;                    //not allowed
  a = malloc(sizeof (int));;   //allowed
}

案例2

const]

上使用[a

此处a地址是常量。 a的值可以更改。

int * const a = malloc(sizeof (int));
if (a)
{
  *a = 10;                      //allowed
  //a = malloc(sizeof (int));;    //not allowed
}

修改

根据@lifeOfPI的建议,请阅读有关使用const_cast

的信息