指针的声明
格式:
typeName* pointName;
例:
int* p;
其中p是指针,而int* 是指向int的指针
指针赋值
应将内存地址赋值给指针,可以对变量名应用&运算符来获得被命名的内存的地址,new 运算符返回未命名的内存的地址
例:
int * pn;
int a=8;
pn=&a;
int * pa;
pa=new int[8];
区分指针和指针所指向的值
int * pt;
pt是指向int的指针,则*pt不是指向int的指针,而是完全等同于一个int类型的变量,pt才是指针
指针算术
C++中允许允许将指针和整数相加。加1的结果等于原来的地址值加上所指向的对象占用了总字节数,还可以将一个指针减去另一个指针获得两个指针的差,后一种运算将得到一个整数,仅当两个指针指向同一个数组,(也可以指向超出结尾的一个位置)时,这种运算才有意义,这将得到两个元素单独间隔。
int tacos[10] = { 5,2,8,4,1,2,2,4,6,8 };
int* pt = tacos;
cout << "pt= " << pt << endl;
pt += 1;
cout << "pt= " << pt << endl;
int* pe = &tacos[9];
cout << "pe= " << pe << endl;
pe -= 1;
cout << "pe= " << pe << endl;
int diff = pe - pt;
cout << "diff= " << diff;
数组的动态联编和静态联编
使用数组声明来创建数组时,采用静态联编,即数组的长度在编译时设置
使用 new[] 运算符创建顺序时,将采用动态联编(动态数组),即将在运行时被数组分配空间,其长度也将在运行时设置,使用完这种数值后,应使用 delete[] 释放其占用的内存。
new 和 delete 遵守的规则
- 不要使用delete 来释放不是new分配的内存
- 不要使用delete来释放同一个内存两次
- 如果使用new[]为数组分配内存,则应使用delete[]来释放
- 如果使用new为一个实体分配内存,则使用delete来释放
- 对空指针应用delete是安全的
错误使用:
int a = 5;
int *pa = &a;
delete pa;