【问题标题】:assigning a pointer to const to a pointer将指向 const 的指针分配给指针
【发布时间】:2014-08-23 09:51:11
【问题描述】:

根据我正在阅读的一本书:

我们可以使用指向 const 的指针来指向一个非常量对象:

我试过了:

int i = 42;
int *p1 = &i;
const int *const p3 = 0;
p1 = p3; //error: invalid conversion from 'const int*' to 'int*' [-fpermissive]

这是为什么?我用整数尝试了这个,它奏效了。这是书中的内容:

int i = 42;
const int ci = i;
int j = ci;

我认为指针也是对象?

【问题讨论】:

  • 书中的行是const int *p1 = &i;。最后一行违反了 constness。
  • 请看我的编辑,我之前发布了错误的代码
  • 你的做法与引文所说的相反。
  • 你没有用整数尝试同样的事情。

标签: c++ pointers


【解决方案1】:

指向const 的指针与权限有关,而不是指向对象的基本类型。

基本上,使用int const *(与const int* 相同),您可以查看int(可能是也可能不是const 本身),但您无法更改它。将非const 指针转换为const 可以让您将指向您自己数据的指针传递给函数,而不必担心函数可能会修改它,即使您仍然可以。

为了保持上述动态,您不能通过分配给另一个指针来“摆脱”constness。* 这就是您的错误所说的。也就是说,

const int * constPtr;
int * nonconstPtr;

*nonconstPtr = 42;      // legal
constPtr = nonconstPtr; // legal

*constPtr = 42;         // illegal!
nonconstPtr = constPtr; // illegal!

* 你实际上可以const_cast<> 抛弃constness。还有correct uses的操作。但它通常是非常错误的,你很可能应该避免它。

【讨论】:

  • 这个例子怎么样:int i = 42;常量 int ci = i;诠释 j = ci;书中说int j = ci;复制 ci 的值,并且此对象与原始对象没有连接。指针不是一样的吗?
  • 啊,那不一样。 const int*int* const 完全无关。第一个是指向常量整数的指针(这是我在答案中谈到的)。第二个是指向整数的常量指针,它只是一个指向读写整数的只读指针。所以是的,指针也是如此。你只需要小心类型。
  • 你的意思是,如果我们说“const int *i = 42;”,只有值 42 是常量,而指针不是?而且由于“int *const i”是一个const指针,你不能把它赋值给一个普通的指针,因为const指针也只能在一个const指针中赋值?
  • 如果你有const int *i,你声明了一个指向常量整数的指针。将指针分配给 42 是合法的,但很可能会崩溃,因为 42 可能不是您被允许读取或写入的地址。您可能指的是const int *i; *i = 42;,这是 不允许的,因为i 指向一个常量整数。关于const int * const 类型,您是正确的。在这种情况下,指针和指针都是const
  • 谢谢!知道了!为了使它工作,我将代码更改为: const int i = 42;常量 int * p1 = &i; int *const p3 = 0; p1 = p3;指针太混乱了:))
猜你喜欢
  • 2018-05-16
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2011-04-02
  • 2015-09-10
  • 2017-05-15
相关资源
最近更新 更多