多维数组与指针{笔记}
a:表示二维数组名,指向一维数组a[0],即0行首地址;
a[0],*(a+0),*a:表示0行0列元素地址;
a+1,&(a+1):1行首地址
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]的值
二维数组名是指向行的;
例如:a和a+1是指向行的指针,在前面加*就是*a和*(a+1),就成为指向列的指针,分别指向a数组0行0列的元素和1行0列的元素;反之,在指向列的指针前面加上&,就成为指向行的指针;
&a[i]或a+i指向行,a[i]或*(a+i)指向列,当列下标为0时,&a[i]和a[i](即a[i]+j)值相等,即相同地址值,但是指向的对象是不同的,指针的类型不同;
在二维数组中,a+i、a[i]、*(a+i)、&a[i]、&a[i][0]的值相等,都是同一地址值;
例子:
#include <studio.h>
#define FORMAT "%d,%d\n"
void int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf(FORMAT,a,*a);
printf(FORMAT,&a[0],&a[0][0]);
printf(FORMAT,a[1],a+1);
printf(FORMAT,&a[1][0],*(a+1)+0);
printf(FORMAT,a[2],*(a+2));
printf(FORMAT,&a[2],a+2);
printf(FORMAT,a[1][0],*(*(a+1)+0));
return 0;
}
例子:用指针变量输出二维数组元素的值。
#include <studio.h>
#define FORMAT "%d,%d\n"
void int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for (p=a[0];p<a[0]+12;p++)
{
if ((p-a[0])%4==0)
{
printf("\n");
printf("%4d\n",*p);
}
}
printf("\n");
return 0;
}
解:p是一个指向整型变量的指针变量,每次p值加1,使p指向下一元素,if语句作用是输出4个数据后换行;
例子2:输出数组任一行任一列元素的值
#include <studio.h>
#define FORMAT "%d,%d\n"
void int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;//(*p)[4]表示p是一个指针变量,指向包含4个整型元素的一维数组;*p有4个元素,每个元素为整型,p所指的对象是有4个整型元素的数组,p是指向一维数组的指针,p的值就是该一维数组的起始地址;
p=a;
scanf("i=%d,j=%d",&i,&j);
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j) );
return 0;
}
用指向数组的指针作函数参数
用指针变量作形参以接受实参数组名传递来的地址,方法:1、用指向变量的指针变量;2、用指向一维数组的指针变量;
#include <studio.h>
void int 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);
search(score,2);
return 0;
}
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\n",*(*(p+n)+i));
}
}
lr 中运行:
Action()
{
float a[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
float *p;//指针变量
float *pl;//指针变量
float sum,aver;
p=&a[0][0];
pl=a[0]+12-1;
for(;p<=pl;p++)
{
sum+=*p; aver=sum/12;
}
lr_output_message("aver=%f",aver);
return 0;
}
查找一门以上课程不及格的学生,输出他们的全部课程的成绩
#include <studio.h>
void main()
{
void search(float(*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
search(score,3);
return;
}
void search(float(*p)[4],int n)
{
int i,j,flag;
for (j=0;j<n;j++)
{
flag=0;
for (i=0;i<4;i++)
{
if (*(*(p+j)+i)<60)
{
flag=1;
}
if (flag==1)
{
printf("NO.%d fails,his scores are:\n",j+1);
for (i=0;i<4;i++)
{
printf("%5.1f\n",*(*(p+j)+i));
printf("\n");
}
}
}
}
}
指针变量存取数组元素速度快,用指针变量做形参,处理的数组大小可以变化;