在 C 和 C++ 中,以下声明的作用是什么?
const int * i;
int * const i;
const volatile int ip;
const int *i;
上述任何声明是否有误?
如果不是,它们之间的含义和区别是什么?
上述声明的有用用途是什么(我的意思是在什么情况下我们必须在 C/C++/嵌入式 C 中使用它们)?
在 C 和 C++ 中,以下声明的作用是什么?
const int * i;
int * const i;
const volatile int ip;
const int *i;
上述任何声明是否有误?
如果不是,它们之间的含义和区别是什么?
上述声明的有用用途是什么(我的意思是在什么情况下我们必须在 C/C++/嵌入式 C 中使用它们)?
const int * i;
i
是一个指向常量整数的指针。 i
可以更改为指向不同的值,但i
不能更改所指向的值。
int * const i;
i
是一个指向非常量整数的常量指针。指向的值i
可以更改,但i
不能更改为指向不同的值。
const volatile int ip;
这个有点棘手。这意味着编译器不会让您ip
更改. 然而,理论上它仍然可以被修改,例如通过获取它的地址并使用操作符。这是非常危险的,不是一个好主意,但这是允许的。限定符表示任何时间被访问,它应该总是从内存中重新加载,即它不应该被缓存在寄存器中。这可以防止编译器进行某些优化。当您有一个可能被另一个线程修改的变量时,或者如果您正在使用内存映射 I/O 或其他可能导致编译器可能不期望的行为的类似情况,您希望使用限定符。使用和const
ip
const_cast
volatile
ip
volatile
const
volatile
在同一个变量上是相当不寻常的(但合法)——你通常会看到一个但看不到另一个。
const int *i;
这与第一个声明相同。
可以这么说,您从右到左阅读 C/C++ 中的变量声明。
const int *i; // pointer to a constant int (the integer value doesn't change)
int *const i; // constant pointer to an int (what i points to doesn't change)
const volatile int ip; // a constant integer whose value will never be cached by the system
他们每个人都有自己的目的。任何 C++ 教科书或半体面的资源都会有各自的解释。