1.地址访问
指针访问使用运算符“*”,指针变量指向数据存放的地址,cpu决定了内存的寻址方式,所以,不管什么类型,指针本身的规格都一样。例如,16位或32位整数。关联类型的作用是控制和解释对象的访问。
如果一个指针变量关联类型为int,则通过指针变量访问对象时,读取从指针值指示的位置开始的连续4个字节,并按整型数据解释。
例如:
int a = 10;
int * p1;
p1 = & a; // 把a的地址写入指针变量p1 p1指向a
用*p1的这种访问方式成为间址访问。
指针p1占用一定的存储空间,在未指定地址的时候,p1所指向的内容为空。
2.引用
C++允许为对象定义别名,称为引用。定义方式:
类型 &引用名 = 对象名;
例如:
#include<iostream>
using namespace std;
int main(){
int a = 2;
int * pa;
int & ra = a;
pa = & a;
cout << a << '\t' << ra << '\t' << * pa << endl; //输出a的值
cout << & a <<'\t'<< & ra <<'\t'<<pa<< endl; //输出a的地址值
cout << & pa <<endl; //输出指针pa的地址值
return 0;
}
ra的类型为int,与a不同之处只有变量名。一个对象的别名,在使用方式和效果上,与使用对象名一致。
3.常量和约束访问
3.1指向常量的指针
用const约束指针对所指对象访问时,这个指针称为指向常量的指针。指向常量的指针指针变量可以获取变量或常量的地址,但限制用指针间址访问对象方式为“只读”。
const 类型 *指针
3.2指针常量
指针变量的值智能在定义的时候初始化,定以后不能修改,即不能改变指针变量的指向。但不影响所指向对象的访问特性。const写在指针变量之前,表示只约束指针变量本身。
类型 *const 指针
例如:
int var1 = 100,var2 = 200;
int * const p1 = & var1;
*p1 = var2;
p1 = &var2; //错误,不能修改指针常量
注意:指针常量不能指向标示常量,因为指针常量仅仅约束指针值为只读,并没有约束间址访问对象,不能用一个无约束间址访问的指针获取标示常量的地址。
3.3指向常量的指针常量
指针本身和所指对象的值在定义之后都限制为只读。
const 类型 * const 指针
3.4常引用
冠以const定义的引用,将约束对象用别名访问时为只读。
const 类型 & 引用名 = 对象名;
4.动态存储
4.1 new和delete操作符
C++用new和delete操作符动态分配储存空间和动态释放储存空间。new和delete的一般语法形式为:
指针变量 = new 类型
delete 指针变量
new操作符按照指定类型的长度分配储存空间,并返回所分配的空间的首地址。
delete操运算释放了指针变量所指的空间,并没有删除指针变量本身的储存单元和清除指针变量原来的值,此时,指针变量依然指向之前所指的空间,但空间已被释放。一个好的编程习惯是,在delete操作之后,对指针变量赋为NULL,清除其无意义的地址值。