常数和变量的指针
const 和 变量 关键字更改指针的处理方式。const 关键字指定指针不能在初始化之后修改;指针从修改的保护。
volatile 关键字指定以外在用户应用程序,该值与下面的名称可以修改事件。因此, volatile 关键字作为声明对象可用于可由多个获取进程或用于与中断服务实例的通信的全局数据区域的共享内存。
当声明的名称作为 volatile时,编译器重新加载从内存的值,每次程序访问。这大大减少可能的优化。但是,在中,在对象状态可能出现意外更改时,它是唯一一种可以确保可预测的程序的性能。
若要声明对象指向的指针作为 const 或 volatile,使用窗体标题:
const char *cpch;
volatile char *vpch;
若要声明指针的值,即指针存储的物理地址 —作为 const 或 volatile,请使用窗体标题:
char * const pchc;
char * volatile pchv;
C++ 语言防止将允许作为 const或指针声明的修改对象的分配。这样的分配将移除对象或指针声明的信息,从而与原始声明的目的。考虑下列声明:
const char cch = 'A';
char ch = 'B';
如果两个对象 (cch,类型 const char和 ch的前面的说明,类型 字符),下面的声明/初始化有效:
const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;
下面的声明/初始化不正确。
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
pch2 的因此声明常数的对象可能已修改的指针和禁止。pch3 的声明中指定 pointer 是常数,而不是对象;该声明禁止 pch2 声明的原因相同禁止。
以下八个分配通过指针显示分配和更改指针值之前声明的;此时,假定,初始化为 pch1 是正确的。 pch8。
*pch1 = 'A'; // Error: object declared const
pch1 = &ch; // OK: pointer not declared const
*pch2 = 'A'; // OK: normal pointer
pch2 = &ch; // OK: normal pointer
*pch3 = 'A'; // OK: object not declared const
pch3 = &ch; // Error: pointer declared const
*pch4 = 'A'; // Error: object declared const
pch4 = &ch; // Error: pointer declared const
作为 const 和 volatile混合声明为 volatile,或指针,遵循规则相同。
为 const 对象的指针通常用于在函数声明如下所示:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
前面的语句声明函数, strcpy_s,这三个参数是类型的指针。 char。由于传递引用,并且不按值,该功能可以自由修改 strDestination 和 strSource ,如果 strSource 未声明为 const。strSource 的声明为 const 的确保调用方 strSource 不能调用函数更改。
说明 |
---|
由于具有从 typename * 的标准转换为 const typename *,它是的合法通过类型 char * 的参数。 strcpy_s。但是,如果反转不为真;隐式转换不存在从对象或指针移除 const 属性。 |
特定类型的 const 指针可以分配给同一类型的指针。但是,并非 const 的指针不能分配给 const 指针。下面的代码显示正确和错误分配:
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
,如果您有一个指针的指针对象,下面的示例演示如何将对象声明为 const。
// const_pointer2.cpp
struct X {
X(int i) : m_i(i) { }
int m_i;
};
int main() {
// correct
const X cx(10);
const X * pcx = &cx;
const X ** ppcx = &pcx;
// also correct
X const cx2(20);
X const * pcx2 = &cx2;
X const ** ppcx2 = &pcx2;
}