您的位置:首页 > 编程语言 > C语言/C++

C语言指针与数组

2012-02-21 16:16 260 查看
                                                          一维数组 与  指针

1.C语言规定:
如果指针变量p已指向同一数组中的下一个元素,见下:

定义: int dates[4],  *p;

那么:dates+2=&dates[2];

      *(dates+2)=dates[2];

延伸:如果:p=&dates
;

      那么:p+i 就指向 &dates[n+i];

            *(p+i)就指向 dates[n+i];

             

            p-i 就指向 &dates[n-i];

            *(p-i)就指向 dates[n-i];

例子: 函数1

 int array_sum(int array, int n)

 {

   int sum=0, *p;

   int *array.end=array+n

   for(p=array;p<array_end;p++)

   sum+=*p;

  

   return(sum);

 }

函数2

int array_sum(int array, int n)

 {

   int sum=0;

   int i;

   for(i=0;i<n;i++)

   sum+=array[i];

   return(sum);

 }

总结:

    C语言编译程序通常会将其中array[i]处理为*(array+i),

每次都要增加一次加法运算,效率就会低一些,所以使用指针访

问数组元素的主要原因。

#include<stdio.h>

int array_sum(int array[], int n);

void main()

{

  int a[10],i;

  printf("请输入10个元素:\n");

  for(i=0;i<10;i++)

  scanf("%d",&a[i]);

  printf("输入的元素是:\n");

   for(i=0;i<10;i++)

  printf("%d",a[i]);

  printf("输入元素的和是:\n");

  printf("%d",array_sum(a,10));

}

int array_sum(int array[], int n)

{

   int sum=0, *p;

   int *array_end=array+n;

   for(p=array;p<array_end;p++)

   sum+=*p;

   return(sum);

}

   

 

                                                            二维数组与指针

数组都是按照行来存储的。

例如:

   int a[3][4]={{10,20,30,40},{50,60,70,80},{90,91,92,93}};

   则数组a有三个元素,分别为a[0],a[1],a[2].每个数组都是一维数组,

各包含4个元素。如a[1]的4个元素分别是:a[1][0]  a[1][1] a[1][2] a[1][3]

分解图:

     数 组         --------------->

      a        a[0]--------------->10   20    30    40

               a[1]--------------->50    60    70    80 

               a[2]--------------->90    91    92    93

再如:

    int *p=a[0];

    则数组a的元素a[1][2]对应的指针为:  p+1*4+2

    元素a[1][2] 也就可以表示为      :      *(p+1*4+2)

    用下标表示法,a[1][2]表示为:          p[1*4+2]

    对于二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。

    a[0] 是一维数组的名字,它指向的是a[0]数组的首元素。

    *a[0]得到的是一个数组元素的值,即a[0]数组首元素的值。所以*a[0]和a[0][0]是一个值。

     a   是二维数组的名字,它指向所有元素的首元素。它的每一个元素   都是一个行数组,

         因此 它的指针移动单位是“行”,所以a+i指向的是第i行的数组。即指向a[i].

    *a  得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。

  备注:

      当int *p; 定义指针p时,p是一个指向int型的数据,而不是一个地址,

所以 *p=a[0]是对的。

    由上面可知道:

    对于二维数组a,其a[0]数组由a指向,a[1]数组由a+1指向,以此类推:

a[i]的数组,由*(a+i)指向。

   对于数组元素a[i][j],用

   *(*(a+i)+j)  表示,指向该元素的指针为*(a+i)+j.

 数组名虽然是数组的首地址,但数组名自定义的时候就确定了,不可以通过赋值老

改变。但指向数组的指针,指针变量的值可以改变,即它可以随时指向不同的数组

或同类型变量。

#include<stdio.h>

int main()

{

  int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};

  int *p=a[0],max,row,col,i,j;

  max=a[0][0];

   for(i=0;i<3;i++)

     for(j=0;j<4;j++)

  {

     if(*(p+i*4+j)> max)  //行存储

      {

        max=*(p+4*i+j);

        row=i;

        col=j;

      }

    }

    printf("a[%d][%d]=%d\n",row,col,max);

    return 0;

}

二维数组指针:

数据类型 (*指针变量名)[二维数组列数]

对上述a数组,行数组指针定义如下:

int (*p)[4]

表示:

数组*p有4个int型元素,分别是(*p)[0] 、 (*p)[1]  、(*p)[2]  、(*p)[3]。

可用下列方式对指针赋值:

p=a;

赋值后p的指向:

p----------->10    11    12   13

p+1--------->20    21    22   23

p+2--------->30    31    32   33

修改上面的例子可以改成:

//题目:求二维数组元素的最大值,并确定最大值元素所在的行和列

//题目:求二维数组元素的最大值,并确定最大值元素所在的行和列

#include<stdio.h>

int main()

{

  int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};

  int (*p)[4],max,row,col,i,j;

  p=a;

  max=a[0][0];

  for(i=0;i<3;i++)

    for(j=0;j<4;j++)

     {

     //if(*(p+i*4+j)> max)

      if(*(*(p+i)+j)>max)       //修改的地方

 {

  //max=*(p+4*i+j);

    max=*(*(p+i)+j);
    row=i;

    col=j;

 }

    }

    printf("a[%d][%d]=%d\n",row,col,max);

    return 0;

}

备注:

a[0]:是一维数组的名字,它指向的是a[0]数组的首元素。

a   :是二维数组的名字,它指向所有元素的首元素。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 c 存储 ini