(一)引用数组元素时指针的运算
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组的下一个元素,p-1指向同一数组的上一个元素。
附:P+1并不是简单将值+1,而是加上元素所占的字节数。
int、float、long都是占4个字节,char占一个字节。
(二)*p++、*(p++)、*(++P)、++(*p)、*(p--)、*(--p)之间的区别
*p++先执行*p,再指向下一元素
*(p++)和*p++一样,因为++和*是相同优先级,结合方向自右向左
*(++p)先使p++指向下一元素,在取*p
++(*p)先执行*p,然后将p指向元素的值+1
*(p--)先执行*p,然后p再自减
*(--p)则是p先自减,然后再取*p
(三)用数组名做函数参数
用变量名作为函数参数时传递的是变量的值,而用数组名做函数参数时,传递的是数组首元素地址
例如,实现将数组中n个整数按相反顺序存放
1 #include<stdio.h> 2 int main(){ 3 void inv(int x[],int n); 4 int i,a[10]={3,7,9,11,0,6,7,5,4,2}; 5 6 inv(a,10); //用数组名做参数传递的是数组首元素地址 7 for(i=0;i<10;i++) 8 printf("%d",a[i]); 9 return 0; 10 } 11 //inv函数用来交换两个数组元素 12 void inv(int x[],int n){ // 实参把数组a的首元素地址传到形参 13 int temp,i,j,m=(n-1)/2; 14 for(i=0;i<=m;i++){ 15 j=n-1-i; 16 temp=x[i];x[i]=x[j];x[j]=temp; 17 } 18 }
(四)通过指针引用多维数组
1.多维数组元素地址问题
假如存在一个二维数组 int a[3][4]
a+1代表的是a[1]的首元素地址,也就是第一行首元素的地址
a[0]+1代表的是第0行第一个元素的地址
*(a+0)+1代表的也是第0行第一个元素的地址
*(*(a+0)+1)代表的是第0行第一个元素的值
总结:
二维数组名是指向行的,一维数组名是指向列的。
在指向行的指针前面加一个*,就转换成指向列的指针 如:*a指向第0行第0列
在指向列的指针前面加一个&,就转换成指向行的指针 如:&a[0]指向第0行
(五)指向数组的指针
引入一个例子,该例子为查找有一门以上课程不及格学生的全部成绩
1 #include<stdio.h> 2 int main(){ 3 void search(float (*p)[4],int n); //(*p)[4]是指向含有4个元素的一维数组的指针变量 4 float score[2][4]={{65,57,70,60},{58,87,90,81}}; 5 6 search(score,2); //score与(*p)[4]要类型一致 7 return 0; 8 } 9 10 void search(float (*p)[4],int n){ 11 int i,j,flag; 12 for(j=0;j<n;j++){ 13 flag=0; 14 for(i=0;i<4;i++) 15 if(*(*(p+j)+i)<60) flag=1; 16 if(flag==1){ 17 for(i=0;i<4;i++){ 18 printf("%5.1f",*(*(p+j)+i)); 19 } 20 printf(" "); 21 } 22 } 23 }