指针

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) 中的粗体部分





posted @ 2015-06-28 14:31  vitah  阅读(203)  评论(0编辑  收藏  举报