是什么const在"顶级"预选赛中,C平均++?
还有什么其他水平?
例如:
int const *i;
int *const i;
int const *const i;
Run Code Online (Sandbox Code Playgroud)
Jam*_*nze 56
顶级const限定符会影响对象本身.其他只与指针和引用相关.它们不会使对象成为常量,并且仅阻止使用指针或引用通过路径进行修改.从而:
char x;
char const* p = &x;
Run Code Online (Sandbox Code Playgroud)
这不是顶级const,并且没有对象是不可变的.表达式*p不能用于修改x,但其他表达式可以; x不是常数.对于这个问题
*const_cast<char*>( p ) = 't'
Run Code Online (Sandbox Code Playgroud)
是合法的,定义明确.
但
char const x = 't';
char const* p = &x;
Run Code Online (Sandbox Code Playgroud)
这次,有一个顶级const x,所以x是不可变的.不允许表达式更改它(即使const_cast使用).编译器可以放入x只读存储器,并且可以假设x永不改变的值,而不管其他代码可能做什么.
要将指针指向顶级const,您需要写:
char x = 't';
char *const p = &x;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,p将指向x永远; 任何改变它的尝试都是未定义的行为(并且编译器可能放入p只读内存,或者假设*p引用x,不管其他任何代码如何).
Bla*_*iev 12
int *const i置于const顶层,而int const *i不是.
第一个说指针i本身是不可变的,而第二个指的是指针指向的内存是不可变的.
每当const出现在标识符类型之前或之后,就被认为是顶级限定符.
小智 10
const 的两个级别是: * 低级 Const * 顶级 Const
您应该通过引用和指针查看顶层和底层 const,因为这是它们相关的地方。
int i = 0;
int *p = &i;
int *const cp = &i;
const int *pc = &i;
const int *const cpc = &i;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,有 4 种不同的指针声明。让我们逐一分析,
int *p: Normal Pointer可用于对底层对象进行更改,并可重新分配。
int *const cp(顶级常量):常量指针可用于对底层对象进行更改,但不能重新分配。(不能将其更改为指向另一个对象。)
const int *pc(低级 const):指向 Const 的指针不能用于对底层对象进行更改,但本身可以重新分配。
const int *const cpc(顶级和低级 const):Const 指向 Const 的指针既不能用于对底层对象进行更改,也不能对其本身进行重新分配。
此外,当分配给另一个对象时,始终忽略顶级 const,而不会忽略低级 const。
int i = 0;
const int *pc = &i;
int *const cp = &i;
int *p1 = cp; // allowed
int *p2 = pc; // error, pc has type const int*
Run Code Online (Sandbox Code Playgroud)
希望这有帮助:) 仅供参考:C++ Primer 有很多关于相同的信息!!!
给我解释的方式,给出:
[const] TYPE * [const] VARIABLE
Run Code Online (Sandbox Code Playgroud)
VARIABLE被用于指向数据类型的类型通过*VARIABLE
在*或多个*s中画一条线
const向左侧的的*它适用于
数据和数据无法更改:*VARIABLE无法分配,除了在初始化const向右边的的*它适用于
可变,什么变量,以不能改变要点:VARIABLE不能分配,除了在初始化所以:
| left right
int * i1;
| no no can change *i1 and i1
int const * i2;
| yes no cannot change *i2 but can change i2
int * const i3;
| no yes can change *i3 but i3 cannot be changed
int const * const i4;
| yes yes cannot change *i4 or i4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9028 次 |
| 最近记录: |