指针运算
【1】赋值运算
指针变量在使用之前必须有确定的指向。
NULL是一个指针常量,表示空地址。当指针变量暂时无法确定其指向或暂时不用时,可以将它指向空地址,以保证程序的正常运行。
【2】间接引用运算
符号*也称为间接引用运算符,其运算结果为该指针所指对象的值。
【3】算术运算
指针加上或减去一个整数n,表示指针从当前位置向后或向前移动n*sizeof<数据类型>大小的地址空间。
【4】两指针相减
a:当两个指针指向同一数组时,两个指针的相减才有意义。
b:两个指针相减的结果是一个整数,表示两个指针之间数组元素的个数。
`int a[10];
int* p1=&a[1]; //p1指向a[1]
int* p2=&a[6]; //p2指向a[6]
int b=p2-p1; // b=5
【5】比较运算
pf1==pf2 //表示pf1和pf2指向同一数组元素;
pf1>pf2 //表示pf1处于高地址位置;
pf1<pf2 //表示pf1处于低地址位置。
注意:指针变量还可以与0比较,判断指针是否为空指针。
p==0 表明p是空指针,表示它不指向任何变量。
指针变量为0和指针变量未赋值是不同的概念。
指针与数组
指针与数组的关系
1:数组名会被解释成数组首元素的指针,即首元素的地址。
int a[]={12,22,32,42,52,62,72,82,92,102};
int *pa=a; //指针变量p指向数组a的首地址
2:p[i]和*(p+i)这两种形式是等价的,都表示访问数组的第i+1个元素。
指针与多维数组的关系
C++允许把一个二维数组分解为多个一维数组来处理。
int iarr[3][4];
int *pi = iarr[0];
for(int i=0;i<3;i++,pi+=4)
{
for(int j=0;j<4;j++)
pi[j] = i*j;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
cout<<iarr[i][j]<<endl;
}
system(“pause”);
int (*p)[4];
它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a[0],其值等于a、a[0]、或&a[0][0]。
//表示一个指向二维数组的指针变量,该二维数组的列数为4
int *p[4];
//表示p是一个指针数组,4个下标变量p[0]、p[1]、p[2]、p[3]均为指针变量。
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cout<<*(*(p+i)+j)<<endl;
system(“pause”);
二级指针的使用
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
由于指针变量直接指向变量,所以称为单级间接访问。而如果通过指向指针的指针变量来访问变量,则构成了二级或多级间接访问。
char *ps[]={ "BASIC","DBASE","C","FORTRAN","PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++)
{
pps=ps+i;
cout<<*pps<<endl;
}
system(“pause”);
常量与指针
指向常量的指针 (常量指针)
const <数据类型> *<指针变量>;
1)无法通过指针修改指向的数据;
2)可以修改指向;
3)该指针能够指向常量;
const int A=3;
int B=5;
const int *pInt=&A;
*pInt=10; //错误,无法修改
pInt=&B; //正确,可以改变指向
指针常量
在指针定义语句的指针名前加const,表示指针本身是常量,称为指针常量。
<数据类型> * const <指针变量>;
修饰符const与<指针变量>紧邻,说明<指针变量>不允许修改,但可以通过*<指针变量>修改指针所指向变量的值。
char strText[32]="head";
char* const strName=strText;
strName=strName+2; //错误,无法修改指向
*strName='n'; //正确,可以修改
*(strName+2)='r'; //正确
指向const型变量的const型指针变量
const <数据类型> *const <指针变量>;
指向const型变量的const型指针变量既不可以修改<指针变量>的值,也不可以通过*<指针变量>修改指针所指向变量的值。