详谈指针

指针是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

指针大小的比价,主要是比较地址是高位还是低位!


猜你喜欢

转载自blog.csdn.net/newandbetter/article/details/80167745