您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > C-10二维数组和指针
二维数组和指针目标了解并学会使用二维数组二维数组和指针inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};二维数组和指针a[0]-1357a[1]-9111315a[2]-17192123a-a是一个数组名,a数组包含3个元素,每个元素又是一个一维数组a[0]-1a[0]+1-3a[0]+2-5a[0]+3-7a[0]+4-9a[0]+5-11a[0]+6-13a[0]+7-15a[0]+8-17a[0]+9-19a[0]+10-21a[0]+11-231357911131517192123a[0]a[1]a[2]a按顺序输出数组中的元素voidmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};for(inti=0;i12;i++){printf(%d\n,*(a[0]+i));}}按顺序输出数组中的元素voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};for(inti=0;i12;i++){printf(%d\n,*(a[0]+i));}}voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int*p=&a[0][0];for(inti=0;i12;i++){printf(“%d\n”,*(p++));}}int*p=*a;int*p=a;int*p=(int*)a;多维数组的地址inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000,则表示形式含义地址a二维数组名,指向一维数组a[0],即0行首地址2000a[0],*(a+0),*a0行0列元素地址2000a+1,&a[1]1行首地址2016a[1],*(a+1)1行0列元素a[1][0]的地址2016a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址2024*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值元素值为132321191715131197531a[2]a[1]a[0]a按顺序输出数组中的元素voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};for(inti=0;i3;i++){for(intj=0;j4;j++){printf(%d\n,*(a[i]+j));}}}按顺序输出数组中的元素voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};for(inti=0;i3;i++){for(intj=0;j4;j++){printf(%d\n,a[i][j]);}}}例#includestdio.h#includectype.hvoidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};printf(%d\n,a);printf(%d\n,a[0]);printf(%d\n,&a[0][0]);printf(%d\n,a[1]);printf(%d\n,&a[1]);}#includestdio.h#includectype.h#defineFORMAT%d,%d\nvoidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};printf(FORMAT,a,*a);printf(FORMAT,a[0],*(a+0));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));getchar();}有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。用函数average求总平均成绩,用函数printScore输出第n个学生的成绩。#includestdio.hvoidaverage(float*p,intn);voidprintScore(float(*p)[4],intn);voidmain(){floatscore[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};average(*score,12);printScore(score,2);}voidaverage(float*p,intn){float*p_end;floatsum=0,aver;p_end=p+n-1;for(;p=p_end;p++)sum=sum+(*p);aver=sum/n;printf(average=%5.2f\n,aver);}voidprintScore(float(*p)[4],intn){inti;printf(thescoreofNo.%dare:\n,n);for(i=0;i4;i++)printf(%5.2f,*(*(p+n)+i));}程序运行结果如下:average=82.25ThescoreofNo.2are:90.0099.00100.0098.00*(p[n]+i)inta[4];(a有4个元素,每个元素为int型)int(*p)[4];(p是一个指针变量,p的值是一个包含4个元素的一维数组的地址。指向的是一个包含4个元素的一维数组)(*p)[0](*p)[1](*p)[2](*p)[3]p-….…..…….………..int*p[4];(p是指针数组,有4个元素,每个元素为int*型)p[0]p[1]p[2]p[3]…………在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。#includestdio.hvoidsearchPrint(float(*p)[4],intn);voidmain(){floatscore[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};searchPrint(score,3);}voidsearchPrint(float(*p)[4],intn){inti,j,flag;for(j=0;jn;j++){flag=0;for(i=0;i4;i++){if(*(*(p+j)+i)60)flag=1;if(flag==1){printf(No.%dfails,hisscoresare:\n,j+1);for(i=0;i4;i++)printf(%5.1f,*(*(p+j)+i));printf(\n);}}}}程序运行结果如下:No.1fails,hisscoresare:65.057.070.060.0No.2fails,hisscoresare:58.087.090.081.0指针数组和指向指针的指针指针数组的概念一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为:类型名数组名[数组长度];例如:int*p[4];例:将若干字符串按字母顺序(由小到大)输出。#includestdio.h#includestring.hvoidsort(char*name[],intn);voidprint(char*name[],intn);voidmain(){char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computerdesign};intn=5;sort(name,n);print(name,n);}char*name[5];name[0]=Followme;name[1]=BASIC;name[2]=GreatWall;name[3]=FORTRAN;name[4]=Computerdesign;voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(strcmp(name[k],name[j])0)k=j;}if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}voidprint(char*name[],intn){inti;for(i=0;in;i++)printf(%s\n,name[i]);}运行结果为:BASICComputerdesignFORTRANFollowmeGreatWall指向指针的指针定义一个指向指针数据的指针变量:char**p;p的前面有两个*号。*运算符的结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量p是指向一个字符指针变量的。*p就是p所指向的另一个指针变量。使用指向指针的指针。#includestdio.hvoidmain(){char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computerdesign};char**p;inti;for(i=0;i5;i++){p=name+i;printf(%s\n,*p);}}#includestdio.hvoidmain(){char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computerdesign};char**p;inti;for(i=0;i5;i++){p=name+i;printf(%s\n,*p);}}一个指针数组的元素指向整型数据的简单例子。#includestdio.hvoidmain(){inta[5]={1,3,5,7,9};int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};int**p,i;p=num;for(i=0;i5;i++){printf(%d,**p);p++;}}指针数组作main函数的形参指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:voidmain()括弧中是空的。main函数可以有参数,例如:voidmain(intargc,char*argv[])。命令行的一般形式为命令名参数1参数2……参数n例如一个名为file1的文件,它包含以下的main函数:voidmain(intargc,char*argv[]){while(argc1){++argv;printf(%s\n,*argv);--argc;}}在DOS命令状态下输入的命令行为file1ChinaBeijing则执行以上命令行将会输出以下信息:ChinaBeijing练习一下将一个dimY行和dimX列的二维数组src的行列交换,交换后的数组存放在dst中,dst中有dimX行和dimY列。要求:使用函数实现,并在main函数中对此函数进行验证使用两种以上的传参数的方法实现
本文标题:C-10二维数组和指针
链接地址:https://www.777doc.com/doc-4011626 .html