指针
1、
对于一维数组来说:(p是指针,a是数组名)
*(p--)相当于a[i--] 先对p进行*运算,再使p自减
*(--p)相当于a[--i] 先使p自减,在进行*运算
++与--同理。
2、
通过指针引用多维数组中:
定义 int a[3][4];
此时,a代表首行(即第0行)的首地址。
a+1代表第一行的首地址。
C语言中规定了数组名代表数组首元素的地址,因此a[0]代表一维数组a[0]的第0列元素的地址,即&a[0][0],
a[1]值是&a[1][0].
(二维数组中)
表示形式 含义
a 二维数组名,指向一维数组a[0],即0行首地址
a[0],*(a+0),*a 0行0列元素地址
a+1,&a[1] 1行首地址
a[1],*(a+1) 1行0列元素a[1][0]的地址
a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址
*(a[1]+2),*(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值
3、
关于 int (*p)[m];形式:
这时候的p不是指向整型变量,而是指向一个包含m个元素的一维数组。这时,如果p先指向a[0](即p=&a[0]), 则p+1 不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。
例子:int (*p)[4];
表示*p有4个元素,每个元素为整型。就是p所指向的对象是有4个整型元素的数组,即p是指向一维数组的指针。此时p只能指向一个包含4个元素的一维数组,p的值就是一维数组的起始地址。p不能指向一维数组中的某一元素。
此例中,p+n是a[n]的起始地址,*(p+n)+i是a[n][i]的地址,*(*(p+n)+i)是a[n][i]的值。
代码:
一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。
#include<stdio.h>
void main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={ {65,67,70,60}, {80,87,90,81}, {90,99,100,98} };
average(*score,12); (注意:此行可以以另外形式:average(score,12); )
search(score,2);
}
void average(float *p,int n)
{
float *p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (*p)[4],int n)
{
int i;
printf("The score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("% 5.2f",*(*(p+n)+i));
printf("\n");
}
注意函数 search(float (*p)[4],int n)
中的粗体部分void main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={ {65,67,70,60}, {80,87,90,81}, {90,99,100,98} };
average(*score,12); (注意:此行可以以另外形式:average(score,12); )
search(score,2);
}
void average(float *p,int n)
{
float *p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (*p)[4],int n)
{
int i;
printf("The score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("% 5.2f",*(*(p+n)+i));
printf("\n");
}