指针

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





你可能感兴趣的:(指针)