1) &的使用
a)作为取址运算符,运用在一个对象上,返回对象的地址。运用在赋值语句的右侧,或者指针变量初始化表达式中。
#include <iostream>
using namespace std;
int main()
{
int a = 99;
int ra = *&a;
int *pa = &a;
cout << "The first value is "<<ra<<endl
<<"The second value is "<<*pa<<endl;
return 0;
}
b)
引用的声明,在类型名称与所声明的引用名称的中间。
#include <iostream>
using namespace std;
int main()
{
int a = 99;
int &ra = a;
cout << "The value is "<<ra<<endl;
return 0;
}
2) * const 与 const * 的使用
假设有一个ptr指针,它保存变量val的地址。
Type* ptr = &val;
当使用指针时,会涉及两个对象:指针本身以及它所指向的对象。这意味着对const可以采用三种保护层次。
a) 如果使用指针时ptr无法指向任何其他的内存地址(无法保存另一个内存地址),有两种编写语句的方式:
Type* const ptr = &val;
Type* const ptr(&val);
指针是常量(const),但地址对象是可以变化的。
b) 如果希望确保无法通过解引用ptr来改变val的值,有两种编写语句的方式:
const Type* ptr= &val;
const Type* ptr(&val);
c) 如果希望两者都收到保护(无法改变),则可以编写语句
const Type* const ptr =&val;
const Type* const ptr(&val);
可以用以下方式进行记忆:把定义从右向左读,就是从定义的变量开始读。
const char* x = &p; /*x 是一个指向const char的指针*/
char* const y = &q;/* y 是一个指向char的const指针*/
const char* const z = &r;
/*z 是一个指向const char的const 指针*/
3) volatile
volatile 是能够修改变量和指针定义的另一个关键字。同const一样,可以理解成const的反义。用它标记的对象在任何时候都可以修改,可以发生在另一个程序或者另一个线程中。它是对编译器的一种提示,访问它时,不应该进行优化。
volatile可以用于变量,但是多用于指针,与const一样,volatile可以用于指针或者被编址的内存。
为了将常规指针声明成volatile内存,应使用形式:
volatile char* vcharptr;
为了将volatile指针声明称常规内存,应使用形式:
char* volatile vptrchar;