注:数组元素的指针就是数组元素的地址,数组名就是数组中首个元素的地址且是常量不能改变。
1、对一维数组元素的访问共有三种方式:
1.通过数组下标访问数组元素;
2.通过地址访问数组元素:
int a[10];
for(int i=0;i<10;i++)
{
*(a+i)=i;
}
3.通过指针访问数组元素:
int a[10];
int *p=a;
for(int i=0;i<10;i++)
{
*(p+i)=i;
}
注:在这里变量指针p和常量指针a是有区别的。a是一个常量不可以改变,而p是一个变量,可以去改变p的值,即p是可以移动的,而a是不能够移动的。所以上面的3.的程序还可以写为:
int a[10];
int *p=a;
for(int i=0;p<(a+10);i++)
{
*(p++)=i;
}
实际上p++的自增运算要比p+i算术运算快很多,因此指针的执行效率比地址更高。
2、指针变量的算术运算
指针与整数的加减运算。对指针变量加上或减去一个整数,表示将该指针后移或前移。
两个同类型指针的减法运算。对两个相同类型的指针变量进行减法运算,表示这两个指针之间有多少个存储单元。
指针变量没有与浮点数的加减运算,也没有乘除运算,也没有两个指针变量之间的加、乘、除运算。
因为数组占用一段连续的内存空间。因此指针的算术运算通常用于数组中。(但是指针变量没有乘除等运算)
3、指针变量的关系运算
同类型指针之间进行比较运算。不同类型指针之间的比较没有意义。
假设p和q是两个同类型的指针变量,则:
p == q:判断指针p和q是否指向同一存储单元 。
p>q:指针p所指存储单元在指针q所指存储单元的后面。
p!=NULL:判断指针p是否为空指针。
一维数组作为参数的特点:形参数组和实参数组是同一个数组。主程序与子函数分别用不同的名字,共用一块空间。因此在子程序中,通过对形参数组的任何改变,都会影响相应的空间,导致实参数组发生改变。
数组中的[ ]是变址运算符,如a[i]的意思是先按a+i计算地址,然后再找出地址单元中的内容即*(a+i)。
如果指针变量p1和p2都指向同一数组,若p2-p1,则p2-p1的结果为两个地址之差再除以数组元素的长度,如int a[N],p2指向a[5](地址为2020),p1指向a[3](地址为2012),则p2-p1的答案为(2020-2012)/4=2。p2-p1的结果的含义是p2所指的元素与p1所指的元素之间差2个元素。
要注意带下标的指针变量,指向数组元素的指针变量也是可以带有下标的。因为在程序编译时,p[i]被转换为*(p+i),若p是指向a[3] (即p=&a[3]),则此时的p[2]并不是指向a[2]的,而是指向a[3+2]的。(个人感觉这种写法容易造成理解错误,不推荐使用)
p[2] == * ( (p+3)+2);