指针3多维数组与指针_第1页
指针3多维数组与指针_第2页
指针3多维数组与指针_第3页
指针3多维数组与指针_第4页
指针3多维数组与指针_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多维数组与指针,8.3.4 多维数组与指针 p245,1. 多维数组元素的地址,先回顾一下多维数组的性质,可以认为二维数组是“数组的数组“,例 : short int a34= 1,3,5,7,9,11,13,15,17,19,21,23; 则二维数组a可看成是由3个一维数组所组成的。设二维数组的首行的首地址为2000 ,则,2000,2008,2016,a0+1 :对应第0行第1列的地址,为2002 a1+1:对应第1行第1列的地址,为2010 a2+1 :对应第2行第1列的地址,为2018 如图10 . 22所示。,二维数组名 a 代表数组a的首元素的地址,为2000,数组a的每一个元素都是一个长度为4的一维数组,故,a+1 :代表下标为1的元素的地址 2008,对应数组名a1 a+2 :代表下标为2的元素的地址 2016,对应数组名a2,一维数组名a0代表数组a0的首元素的地址 &a00 一维数组名a1代表数组a1的首元素的地址 &a10 一维数组名a2代表数组a2的首元素的地址,&a20故,图8.20,a0,a1,a2,p246, a i *( a + i ) a i + j *( a + i )+j &a i j *(a i + j) *(*( a + i )+j ) a i j 由上可看出: a + 1 : 1代表一行中全部元素所占字节数 8 a i + 1 : 1代表一列元素所占字节数 2,所以,第i行第j列的元素的地址可表示为: a i + j,a与a0的值虽相同,但由于指针类型不同: a: 二维数组名,指向行 a0; a0:一维数组名,指向列元素 a00。 故 a+1 a0+1,对一维数组int aN: ai 表示a数组的第i个元素的值 对二维数组int aNM: ai 是一个一维数组名,是一个地址,在行指针前加一个*,行指针就转换为列指针 *a = a0 : 指向第0列的指针 在列指针前面加&,列指针就成为行指针 &a0 =a : 指向第0行的指针,直接使用二维数组下标,#include “stdio.h“ void main() short int a34=0,1,2,3,10,11,12,13,20,21,22,23; int i, j; for(i=0; i3; i+) printf(“n“); for(j=0; j4; j+) printf(“%p: %dn“, ,以一维数组名为指针,#include “stdio.h“ void main() short int a34=0,1,2,3,10,11,12,13,20,21,22,23; int i, j; for(i=0; i3; i+) printf(“n“); for(j=0; j4; j+) printf(“%p: %dn“, ai+j , *(ai+j) ); ,以二维数组名为指针,#include “stdio.h“ void main() short int a34=0,1,2,3,10,11,12,13,20,21,22,23; int i, j; for(i=0; i3; i+) printf(“n“); for(j=0; j4; j+) printf(“%p: %dn“, *(a+i)+j , *(*(a+i)+j) ); ,以下程序是否有误?,#include “stdio.h“ void main() short int a34=0,1,2,3,10,11,12,13,20,21,22,23; int i, j; for(i=0; i3; i+) printf(“n“); for(j=0; j4; j+) printf(“%p: %dn“, (a+i)+j , *(*(a+i)+j) ); ,例10.10 输出二维数组有关的值,main() int a34=0,1,2,3,4,5,6,7,8,9,10,11; printf(“a =%d, “,a); printf(“*a = %d, “,*a); printf(“a0=%d, “,a0); printf(“ ,int a34=0,1,2,3,4,5,6,7,8,9,10,11;,2 . 指向多维数组元素的指针变量,(1) 指向数组元素的指针变量,例8.11 用指针变量输出二维数组元素的值,#include “stdio.h“ void main() int (*p)4 , a34=0,1,2,3,4,5,6,7,8,9,10,11; int i,j; p=a; for(i=0;i3;i+) printf(“n“); for(j=0;j4;j+) printf(“%2d “, *(*(p+i)+j) ); ,aij在数组amn中的相对位置的计算: i* n + j /*之前有i行,每行有n个;之前还有j个 */ 故 aij的值可表示为 *(p+ i*n+j ) 例如,数组a34中的a23的值可表示为: *(p+ 2*4+3) 即*(p+11) 如图,(2) 指向一维数组的指针变量,例8.13 输出二维数组任一行任一列元素的值,#include “stdio.h“ main() int a34=0,1,2,3,4,5,6,7,8,9,10,11; int(*p)4; int i,j; p=a; printf(“i (0-2): “);scanf(“%d“, , int a4 ; / a为数组名,有4个整型元素 int (*p)4; / *p为数组名,有4个整型元素 这4个元素分别为: (*p) 0 , (*p) 1 , (*p) 2 , (*p) 3 图 8.24 对应于a00a03,a是二维数组名,故p是行指针,指向二维数组的每一行。 *(p + i) + j 是a数组第i行第j列元素的地址。 即 *(*(p + i) + j) 是 aij 的值。,对 int (*p)4; 的理解:,图8.24,图8.25,3. 用指向数组的指针作函数参数,例8.14 有一个班,3个学生, 各学4门课, 计算总平均分数以及第n个学生的成绩。 p252 1) 用指向数组的指针作函数参数。 2) 定义函数average求总平均成绩 3) 定义函数search找出并输出第i个学生的成绩。,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.2fn“,aver); void search(float (*p)4,int n) int i; printf(“ no. %d :n“,n); for(i=0;i4;i+) printf(“%5.2f“,*(*(p+n)+i); ,#include “stdio.h“ void main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81, 90,99,100,98; /*求12个分数的平均分*/ average(*score,12); /*求序号为2的学生的成绩*/ search(score,2); ,例8.15 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。,#include void main() void search(float (*p)4,int n);/*函数声明*/ float score34=65,57,70,60,58,87, 90,81,90,99,100,98; search(score,3); ,void search(float (*p)4,int n) int i,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.%d fails,his scor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论