为什么允许常量整数指针指向非常量整数
Why a constant integer pointer point to a non constant integer allowed?
我目前正在尝试学习一些C++,遇到了以下非直觉行为。由于t
是指向const int
的指针,只要我们不更改t
,我希望*t
保持不变。
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 3;
const int* t = &a; //Why is this allowed? a is NOT const int
a = 4;
cout << *t << endl; //This does then print 4
//*t = 4; //Throws error.
return 0;
}
有人能解释为什么这是编译的吗?
const int* t
只是意味着您不能更改t
指向的值t
,仅此而已。原始值可能会更改,但与t
的责任无关。
如果你想确保这个值不会被更改,你应该让t
指向一个常量,比如
const int a = 3;
const int* t = &a;
对于这种情况,你不能让int*
指针指向它
int* t = &a; // error
由于t是指向
const int
的指针,只要我们不更改t
,我希望*t
保持不变。
一般情况下,您不能做出这样的假设,因为t
可能指向一个非常量对象,例如您的示例。
const int* t = &a; //Why is this allowed? a is NOT const int
有人能解释为什么这是编译的吗?
c++的规则允许CCD_ 15到CCD_ 16的隐式转换。这是允许的,因为有一个指向常量(或引用)的指针指向非常常量对象非常有用。指向const的指针只是表示不能"通过"指针来修改对象。对象本身可以是常量,也可以是非常量。
作为一个有用的例子,您可以将一些可修改的状态作为对象的私有成员,并将const
视图返回给它,以便其他人可以观察,但不能修改。这方面的一个实际例子是CCD_ 18。即使std::string
的内部缓冲区是非常量的,它也返回const char*
。
由于
t
是指向const int
的指针,只要我们不更改t
,我希望*t
保持不变。
答案很简单:指针类型声明中的const
关键字并不意味着"它是常量",而是"不允许修改它"。
例如,当您创建一个变量,然后调用另一个函数来处理它时,这很有用,但您希望禁止修改:
extern int countZerosInArray( const int *array, int arrayLen);
int myVariableArray[ 100 ];
// ... fill the array - i.e. modify it!
int noOfZeros = countZerosInArray(myVariableArray, 100);
countZerosInArray
函数被告知它对数组具有只读访问权限,尽管数组本身当然不是常量。
const int* t = &a; // int* or const int* can assgin to const int*
- 为什么乘以常量有符号整数分数没有优化?
- C++整数常量表达式定义
- C++ 计算编译时常量,同时防止整数常量溢出
- 包含 comptime 断言的整数常量表达式宏
- 通过GNU扩展asm约束加载64位整数常量
- 非整数常量声明 - dev-error:在此范围内未声明"type"
- C++整数常量的类型
- 整数常量的 1024f 后缀无效"F"
- C++映射 - 表达式必须是整数常量表达式
- MSVC 是否错误地处理了类范围的静态与整数常量初始值设定项的链接
- boost序列化错误C4308:负整数常量转换为无符号类型
- 使用整数常量0初始化实例,但不使用其他常数值或整数变量
- 类的私有整数常量的定义:在头还是在 cpp 文件中?
- 大小写标签不减少为整数常量
- 错误:整数常量的后缀Ui64无效
- 错误:整数常量上的后缀"i64"无效
- 错误:整数常量上的后缀"b11111111111111111111111111111111"无效
- :<built-in>1:2: 警告:使用 C++0x 长整型整数常量 [-Wlong-long]
- "LL"可以从硬编码的整数常量中删除,并替换为"static_cast<uint64_t>(...)"吗?
- 错误:整数常量上的后缀"x"无效