我和同事发生了争执。 一旦我尝试修改常量引用。
代码示例如下:
#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
我认为它的工作原理如下:
我创建一个const指针变量A,其中'0'(零)值是堆栈。它是局部变量,占用堆栈中的4个字节的内存。
然后我创建了一个指向变量的指针,我抛弃了常量修改并获取变量的地址
我认为这段代码运行正常,不会导致错误。但我需要某种解释。我对吗?
答案 0 :(得分:3)
const int *a
和int * const a
不同。
在const
]
*a
此处a
的值是常量。 a
指向的地址可以更改。
const int *a = malloc(sizeof (int));
if (a)
{
//*a = 10; //not allowed
a = malloc(sizeof (int));; //allowed
}
在const
]
a
此处a
的地址是常量。 a
的值可以更改。
int * const a = malloc(sizeof (int));
if (a)
{
*a = 10; //allowed
//a = malloc(sizeof (int));; //not allowed
}
修改强>:
根据@lifeOfPI的建议,请阅读有关使用const_cast
。