1.1 指针的概念
声明任何一个变量,系统都会为其分配一定大小的内存,访问变量实际上就是访问其所占据的内存空间。
1.2 指针变量的声明、初始化和访问
1.2.1 声明: 数据类型 *变量名
1.2.2 初始化: 3种方式
(1)初始化为NULL或0:表示指针变量指向的是一片无效的不可访问的内存;
如: int *p= NULL;(NULL必须大写)
(2)初始化为已声明变量的地址;
如: int a;
int *p=&a; (指针变量的声明类型与其所指向的变量的类型必须一致,否则就要给出显式的强制类型转换)
(3)初始化为某一动态分配内存空间的地址。
1.2.3 指针变量的访问
可以通过该指针变量访问内存中的数据,其访问形式为:
*指针变量名
1.3 指针和数组
1.3.1 用指针操作一维数组
要点:定义相同类型的数组和指针变量,将指针变量指向数组首地址。
如:
1 int a[]={1,2},b[]={3,4}
2 int *p=NULL;
3 p=a;
4
5 p=&b[0];
1.3.2 用指针操作二维数组
(1)使用指向行的指针变量操作二维数组
声明形式为: 数据类型 (*指针变量名)[行长度];
如:
1 int a[][2]={1,2},b[][2]={3,4};
2 int (*p)[2]=NULL;
3
4 p=a;
5 cout<<p[0][0]<<p[0][1];
6
7 p=&b[0];
8 cout<<p[0][0]<<p[0][1];
(2)使用指针变量操作二维数组
如:
1 int a[][2]={1,2,3,4},b[][2]={4,3,2,1};
2 int *p=NULL;
3
4 p=a[0];
5 cout<<p[0]<<p[1];
6
7 p=&b[0][0];
8 cout<<p[0]<<p[1];
注:第四行和第七行等价,都表示二维数组第一个元素的首地址。
1.4 指向指针的指针
二级指针变量的声明方式为: 数据类型 **变量名;
。。。
1.5 const指针
const指针分为常量指针和指针常量。
1.5.1 常量指针
声明形式: const 数据类型 *变量名;
常量指针所指向的内存地址可以改变,但通过常量指针只能从内存读取数据,但不能修改内存中的数据。
1.5.2 指针常量
声明形式: 数据类型 *const 变量名;
指针常量是一个常量而不是变量,因此指针常量所指向的内存是固定的,不能改变的,但可以修改内存中的数据。
1.6 堆内存分配
堆内存分配就是动态内存分配,指在程序运行时从堆中为指针变量申请实际需要的内存空间,当其不再使用时,要及时释放。
C++中,使用new和delete这两个关键字完成堆内存分配和释放的操作。
说明:
(1)使用new分配的内存必须使用delete释放,否则会造成内存泄露,导致计算机处理速度变慢。
(2)在使用new分配堆内存时要区分[ ]和()。[ ]指定元素数目,()指定内存初值。如:
1 int a=3;
2 int *p1 = new int[a]; //分配了3个int型大小的内存
3 int *p2 = new int(a); //分配了1个int型大小的内存,且初值为3.
(3)在分配内存时为多个元素分配了内存,那么在使用delete释放内存时必须加[ ].
(4)必须使用指针保存分配的内存首地址,这是由于delete须根据首地址进行内存释放。
(5)如果分配是一个内存,释放时可以将[ ]去掉。
1.7 引用
1.7.1 引用的概念
引用就是别名。
1.7.2 引用的声明
声明形式: 数据类型 &引用名 = 变量名 其中,“&”是引用运算符。 其他用途:位与运算符、取地址运算符。
1.73 const引用
cosnt引用没有常量引用和引用常量之分,两种声明形式:
const 数据类型 &引用名 = 变量名或常量 或者 数据类型 const &引用名 = 变量名或常量
const引用只能访问所引用对象的值,而不能修改所引用对象的值。
好了,今天的学习就到这里了。
参考:
面向对象程序设计----C++高级语言 主编:赵宏