繁体   English   中英

这些声明在C中有什么区别?

[英]What is the difference between these declarations in C?

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

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

上述任何声明是否有误?

如果不是它们之间的含义和差异是什么?

上述声明有什么用处(我的意思是我们必须在C / C ++ / embedded C中使用它们)?

const int * i;

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

int * const i;

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

const volatile int ip;

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

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 ++教科书或半合适的资源都会有解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM