指针是c语言的特色之一,c++沿用了这一特色,并将其进行扩充。指针在c++中有着举足轻重的地位,真正弄清楚c++的指针对于每一个c++学习者来说是非常重要的一件事。
一、
首先,什么是指针?
指针是一种就是变量的地址。
什么是指针变量?
指针变量就是一种特殊的变量,同其他的变量一样,必须在定义语句进行定义,亦可以在定义的同时进行指针变量的初始化。
二、
指针变量的一般形式:
数据类型 * 指针变量名
其中“*”表示*后面的变量名是指针类型;指针变量由用户命名,命名规则同C++标识符;“数据类型”是定义指针变量所指向的目标变量的数据类型。
下面区分两个概念:指针的类型和指针所指向的类型
指针的类型:
把指针声明语句里面的指针名字去掉,剩下的部分就是这个指针的类型。
int *p;//指针类型是int *
char *p;//指针类型是char*
int **p;//指针类型是int**
int (*p)[5];//指针类型是int(*)[5]
指针所指向的类型:
把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
int *p;// int
double *p;//double
int **p;//int *
int (*p)[5];//int()[5]
三、指针的初始化
数据类型* 指针变量名 = 初始地址值
比如:
int a;
int *b = &a;
或者
int a[5];
int *b = a;//这里就涉及到了数组,a代表了该数组的初始地址,a[0]表示第一个数组元素地址的值,&a[0]表示访问第一个数组元素的地址值
注意:右值必须是地址,不能为其他值
比如:
int a[5];
char * p = &a[3];//意味着,指针p指向了a[3]所的地址
char *p = &a[1];//意味着,指针p指向了a[1]处的地址
char *p = a; //意味着,指针p指向了a[0]处的地址,因为a代表了数组a的首地址
四、指针的赋值
首先应该确保对指针进行了初始化,即
int *p = &a;//这种情况是利用另一个变量的地址对p进行了初始化
之后方可以对指针的值进行修改
*p = 6;
如果直接进行指针的值进行修改,则程序会崩溃
比如
int *p;
*p = 5;
这是错误的,因为指针p没有进行初始化,所以无法访问它的地址。
也可以这么理解,指针,它要指向某个地址,这时候他有两部分构成,一是地址值,二是地址中存储的数据,声明了指针p后,即int*p,这时候还需要说明p的指向,如果它不指向某个地址,那么何来更改它的值呢?
五、指针的算数运算
int a[5];
int *p = a;
int *q = p +2;//这时候指向p的指针q就是指向a[2]
int *p;
*p++;//这就涉及到++运算符,p++是先*p,再进行++操作
*(p++);//先p++,再进行*操作
六、指针的大小比较
对于指向同一个数组的指针可以进行大小的比较,大小的判断是根据地址进行比较的。
比如:
int a[10];
int *p = &a[5];
int *q = &a[3];
if(p>q)
{
cout << "YES" <<endl;
}else{
cout << "NO" <<endl;
}
输出结果为YES
指针大小的比价,主要是比较地址是高位还是低位!