一维数组 与 指针
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 :是二维数组的名字,它指向所有元素的首元素。