2019/9/10电气与信息工程学院计算机系制作Lesson18数据的组织结构2019/9/10电气与信息工程学院计算机系制作学习目标:31使用指针作为函数参数2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2例1:将两个数从大到小输出要求:通过使用函数的方法2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2voidswap(int*p1,int*p2);intmain(){inta,b;int*p_1,*p_2;scanf(%d%d,&a,&b);p_1=&a;p_2=&b;if(ab)swap(p_1,p_2);printf(\n%d,%d\n,a,b);}voidswap(int*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;return;}…...20002020202420042008200C2028202C2030...59整型变量a整型变量b(main)指针pr_1指针p_220002004(swap)指针p1指针p2整型p5920002004COPY5做法1lesson18_01_1.c2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2voidswap(int*p1,int*p2);intmain(){inta,b;int*p_1,*p_2;scanf(%d%d,&a,&b);p_1=&a;p_2=&b;if(ab)swap(p_1,p_2);printf(%d,%d,*p_1,*p_2);}voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}…...20002020202420042008200C2028202C2030...59整型a整型b(main)p_1p_22000200420002002COPY(swap)指针p1指针p2指针p****2000地址传递20002004做法2lesson18_01_2.c2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2例2:从键盘输入10个数,输出最大值分析:定义一个函数,该函数返回最大值的地址2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2#includestdio.hint*findMax(int*array,intlen);voidinput(intarray[],intlen);intmain(){inta[10];int*max;input(a,10);max=findMax(a,10);printf(“最大值为=%d”,*max);return0;}lesson18_02.c2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2int*findMax(int*array,intlen){int*p,*pmax=array;for(p=array;parray+len;p++){if(*pmax*p)pmax=p;}returnpmax;}voidinput(intarray[],intlen){inti;for(i=0;ilen;i++){scanf(“%d”,array+i);}return;}请注意参数的定义和函数中的使用方式!2019/9/10电气与信息工程学院计算机系制作3指针作为函数参数2结论:函数的形参是指针和函数的形参是数组二者本质是一致的,都是传入的是一个地址2019/9/10电气与信息工程学院计算机系制作3课堂练习2从键盘输入10个数,按从大到小的顺序输出分析:•在主函数中定义数组data[10]•调用input函数,给data数组输入值•从data[0]开始的10个变量的中最大值的地址(findMax函数),将其和data[0]交换(swap函数)•从data[1]开始的9个变量的中最大值的地址(findMax函数),将其和data[0]交换(swap函数)•从data[2]开始的8个变量的中最大值的地址(findMax函数),将其和data[0]交换(swap函数)•…………直道data[8]为止•调用output函数输出数组data的值循环2019/9/10电气与信息工程学院计算机系制作定义函数output,输出长度为l的数组avoidoutput(inta[],intl){inti;for(i=0;il;i++){printf(%4d,a[i]);}return;}int*max(int*a,intl){int*maxp=a,i;for(i=0;il;i++){if(*maxp*(a+i))maxp=a+i;}returnmaxp;}定义函数max,找出长度为l的数组a中最大值的地址lesson_18_px.c2019/9/10电气与信息工程学院计算机系制作主函数intmain(){intdata[]={1,4,6,7,0,8,2,10,12,9};int*mp,i,t;printf(排序前\n);output(data,10);for(i=0;i10;i++){mp=max(&data[i],10-i);t=data[i];data[i]=*mp;*mp=t;}printf(排序后\n);output(data,10);}注意max(&data[i],10-i)的写法2019/9/10电气与信息工程学院计算机系制作3二级指针3进一步理解指针intx=0;int*p;p=&x;20000xp2000变量p也有地址3000如何取变量p的地址&p2019/9/10电气与信息工程学院计算机系制作3二级指针3intx=0;int*p;p=&x;20000xp20003000保存变量p的地址?定义指针变量int**pp;pp保存一个整型指针变量的地址!2019/9/10电气与信息工程学院计算机系制作3二级指针3intx=0;int*p;int**pp;p=&x;pp=&p20000xp20003000pp3000p*px*pp**pp2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4再来看二维数组inta[3][4]第0个元素第1个元素第2个元素a[0]a[1]a[2]2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4a[0]这是一个一维数组怎么确定其中的元素?a[0][1]可以理解成a[0]即是该数组的名称2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4二维数组:一个元素为一维数组的一维数组a[0]a[1]a[2]2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4再来看二维数组inta[3][4]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]内存是一维的所以二维数组也是可以理解成一个”大”的一维数组二维数组在内存中是按行存储问:a[1][3],在数组中的第几个位置?a[i][j]呢?2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4#includestdio.hintmain(){inta[2][4]={1,2,3,4,5,6,7,8};int*p,i;p=&a[0][0];for(i=0;i8;i++){printf(%3d,*(p+i));if(i%4==0)printf(\n);}}输出二维数组的值lesson18_a.c2019/9/10电气与信息工程学院计算机系制作aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020162032200020042016202420322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1二维数组全理解2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4指针与二维数组的关系假设有下列定义:#defineROWNUM5#defineCOLNUM4inta[ROWNUM][COLNUM];int*ptr1;int(*ptr2)[COLNUM];/*指针类型为int[COLNUM]*/输出二维数组的每个元素内容2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4方法一:ptr1=a[0];for(i=0;iROWNUM;i++){for(j=0;jCOLNUM;j++)printf(%3d,*(ptr1+i*COLNUM+j));printf(\n);}lesson18_a2.c2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4方法二:ptr2=a;for(i=0;iROWNUM;i++){for(j=0;jCOLNUM;j++)printf(%3d,*(*(ptr2+i)+j));printf(\n);}2019/9/10电气与信息工程学院计算机系制作3指针与二维数组4例3:构造一个如下所示的下三角方阵。10000001200000123000012340001234500123456012345672019/9/10电气与信息工程学院计算机系制作3指针与二维数组4问题分析位于下三角部分的元素内容等于列下标加1,上三角部分的元素内容全部为0。位于下三角元素的坐标特点是i=j;位于上三角元素的坐标特点是ij。2019/9/10电气与信息工程学院计算机系制作#includestdio.h#defineNUM7intmain(){inta[NUM][NUM];int*ptr,i,j;/*构造下三角方阵*/for(i=0;iNUM;i++){ptr=*(a+i);/*ptr指向第i行的第1个元素*/for(j=0;jNUM;j++)if(i=j)*(ptr+j)=j+1;/*ptr+j指向ptr所指行的下标为j的元素*/else*(ptr+j)=0;}2019/9/10电气与信息工程学院计算机系制作/*输出下三角方阵*/for(i=0;iNUM;i++){ptr=*(a+i);for(j=0;jNUM;j++)printf(%3d,*(ptr+j));printf(\n);}return0;}lesson18_03.c2019/9/10电气与信息工程学院计算机系制作3课堂练习2已知有4个同学的3门课程的成绩,输出每门课程的最高分要求:1、定义函数findMax(int*a,intlen),查找从a开始的后面len个变量的最大值的地址2、在主函数调用该函数输出最高分。2019/9/10电气与信息工程学院计算机系制作3指针数组5inta[10]int*d[10]a是数组,元素类型为整型d是数组,元素类型为整型指针dad[0]=&a[0]d[3]=&a[9]可以声明数组,其元素都是指针(指针数组)相当于类型2019/9/10电气与信息工程学院计算机系制作3指针数组5例4:在程序中有5种颜色,将其输出#includestdio.hintmain(){inti;char*color[5]={“red”,“green”,“yellow”,“blue”,“white};/*初始化*/for(i=0;i=4;i++)printf(%10s\n,color[i]);return0;}lesson18_04.c2019/9/10电气与信息工程学院计算机系制作3指针数组5在程序中有5种颜色,将其输出red\0green\0yellow\0blue\0white\02019/9/10电气与信息工程学院计算机系制作3数组的指针6我们还可以声明一个指针变量让它指向一个数组int(*p)[5];p就是一个指针,要指向一个含有5个int类型元素的数组,指向其他的就会出现问题