C语言指针与数组

                                                          一维数组 与  指针

1.C语言规定:
如果指针变量p已指向同一数组中的下一个元素,见下:
定义: int dates[4],  *p;
那么:dates+2=&dates[2];
      *(dates+2)=dates[2];

延伸:如果:p=&dates[n];
      那么: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   :是二维数组的名字,它指向所有元素的首元素。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值