在C和C ++中,以下声明有什么作用?
const int * i;
int * const i;
const volatile int ip;
const int *i;
上述任何声明是否有误?
如果没有,它们之间的含义和区别是什么?
上述声明的有用用途(我的意思是我们必须在C / C ++ / embedded C中使用它们)?
答案 0 :(得分:34)
const int * i;
i
是指向常量整数的指针。 i
可以更改为指向不同的值,但i
指向的值无法更改。
int * const i;
i
是一个指向非常数整数的常量指针。可以更改i
指向的值,但无法将i
更改为指向其他值。
const volatile int ip;
这个有点棘手。 ip
为const
的事实意味着编译器不允许您更改ip
的值。但是,它仍然可以在理论上进行修改,例如通过获取其地址并使用const_cast
运算符。这是非常危险的,不是一个好主意,但它是允许的。 volatile
限定符表示访问ip
时,应始终从内存重新加载,即不应将其缓存在寄存器中。这可以防止编译器进行某些优化。如果您有一个可能被另一个线程修改的变量,或者您正在使用内存映射I / O,或者其他可能导致行为的类似情况,您希望使用volatile
限定符,编译器可能不会期待。在同一个变量上使用const
和volatile
相当不寻常(但合法) - 您通常会看到一个而不是另一个。
const int *i;
这与第一个声明相同。
答案 1 :(得分: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 ++教科书或半合适的资源都会对每个教科书进行解释。