5

在 C 和 C++ 中,以下声明的作用是什么?

const int * i;
int * const i;
const volatile int ip;
const int *i;

上述任何声明是否有误?

如果不是,它们之间的含义和区别是什么?

上述声明的有用用途是什么(我的意思是在什么情况下我们必须在 C/C++/嵌入式 C 中使用它们)?

4

2 回答 2

34

const int * i;

i是一个指向常量整数的指针。 i可以更改为指向不同的值,但i不能更改所指向的值。

int * const i;

i是一个指向非常量整数的常量指针。指向的值i可以更改,但i不能更改为指向不同的值。

const volatile int ip;

这个有点棘手。这意味着编译器不会让您ip更改. 然而,理论上它仍然可以被修改,例如通过获取它的地址并使用操作符。这是非常危险的,不是一个好主意,但这是允许的。限定符表示任何时间被访问,它应该总是从内存中重新加载,即它不应该被缓存在寄存器中。这可以防止编译器进行某些优化。当您有一个可能被另一个线程修改的变量时,或者如果您正在使用内存映射 I/O 或其他可能导致编译器可能不期望的行为的类似情况,您希望使用限定符。使用和constipconst_castvolatileipvolatileconstvolatile在同一个变量上是相当不寻常的(但合法)——你通常会看到一个但看不到另一个。

const int *i;

这与第一个声明相同。

于 2008-10-24T04:25:02.873 回答
4

可以这么说,您从右到左阅读 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++ 教科书或半体面的资源都会有各自的解释。

于 2008-10-24T04:26:49.140 回答