数组指针字符串C语言程序设计-第4章.ppt
行指针和列指针定义一个二维数组intarray[3][4]来说明,由于二维数组可以看作特殊的一维数组,其中每一个元素又是一个一维数组,所以可以把数组array看作是由array[0]、array[1]、array[2]三个元素组成的特殊一维数组,而array[0]、array[1]、array[2]又可以分别看作一维数组,所以array[0]、array[1]、array[2]也表示一维数组的起始地址。既然array和array[0]、array[1]、array[2]都表示地址(指针),它们之间有什么区别呢?区别就在于array+1指向的是第2行元素的起始地址,也就是array[1]指向的地址,而array[0]+1指向的是元素array[0][1]的起始地址。array每加1,就跳过一行,所以被称为行指针,而array[0]、array[1]、array[2]被称为列指针。通过运算符*将行指针转换成列指针array与array[0]相等,*array+1与array[0]+1是相等的,这里*只是将行指针转换成了列指针,*array还是表示地址,而不是取地址的内容。若要取元素array[0][0]的内容,可以用*array[0]或**array,这里**array的后一个*表示先将行指针转换成列指针,前一个*表示取内容。array[0]+1和*(array+0)+1,是array[0][1]的地址,那么,*(array[0]+1)就是array[0][1]的值。同理,*(*(array+0)+1)或*(*array+1)也是array[0][1]的值。*(array[i]+j)或*(*(array+i)+j)是array[i][j]的值。务请记住*(array+i)和array[i]是等价的。21array、array+i、array[i]、*(array+i)、*(array+i)+j、array[i]+j都是地址。(array[i]+j)、*(*(array+i)+j)、array[i][j]是二维数组元素array[i][j]的值。指向包含4个元素的一维数组的指针voidmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};int(*p)[4],i,j;p=a;cinij;couta[i][j]=*(*(p+i)+j)endl;}多维数组的地址可作函数参数传递在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法:①用指向变量的指针变量;②用指向一维数组的指针变量。有一个班,3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。用函数average()求总平均成绩,用函数search()找出并输出第i个学生的成绩。0201voidaverage(float*p,intn);1voidsearch(float(*p)[4],intn);2voidmain()3{4floatscore[3][4]={{65,67,70,60},5{80,87,90,81},{90,99,100,98}};6average(*score,12);//求12个分数的平均分7search(score,2);//求第2个学生成绩8}901voidaverage(float*p,intn)02{03float*p_end;04floatsum=0,aver;05p_end=p+n-1;06for(;p=p_end;p++)07sum=sum+(*p);08aver=sum/n;09coutaverage=averendl;10}}for(i=0;i4;i++)coutthescoreofNo.n{cout*(*(p+n)+i);are:endl;inti;voidsearch(float(*p)[4],intn)STEP5STEP4STEP3STEP2STEP1指针数组就是由指针组成的数组,也就是说数组中的每个元素都是相同数据类型的指针变量。指针数组的声明方式和普通数组相似:数据类型说明符*数组名[常量表达式];例如:char*pc[5];声明了一个一维指针数组,其中包括5个元素,均为指向字符类型的指针指针数组voidmain(){ intline1[]={1,0,0};intline2[]={0,1,0};intline