《第7讲 返回指针值的函数-指针数组-指向指针的指针.ppt》由会员分享,可在线阅读,更多相关《第7讲 返回指针值的函数-指针数组-指向指针的指针.ppt(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7讲 指针内容:内容:(1)(1)返回指针值的函数返回指针值的函数(2)(2)指针数组指针数组(3)(3)指向指针的指针指向指针的指针返回指针值的函数l函数的返回值可以是一个指针类型的数据函数的返回值可以是一个指针类型的数据(即地址即地址)返回指针值函数的定义格式返回指针值函数的定义格式:函数类型函数类型 *函数名函数名(形参列表形参列表 )函数体函数体;说明说明:定义一个返回指针值的函数与定义普通函数的格式基本定义一个返回指针值的函数与定义普通函数的格式基本 类似类似,只是在函数名前加只是在函数名前加 *,表明该函数返回一个指针值表明该函数返回一个指针值例例:int *fun(int a,
2、int b)函数体函数体;例例3-4求某班成绩的平均分求某班成绩的平均分,最高分和最低分最高分和最低分要求用返回指针值的函数实现要求用返回指针值的函数实现分析分析:n通过函数通过函数average的返回值的返回值得到保存平均分变量的地址得到保存平均分变量的地址,进而得到平均分进而得到平均分,函数中将函数中将平均分变量定义成静态的平均分变量定义成静态的,这样函数结束后该变量仍然这样函数结束后该变量仍然存在。存在。mainpaverageaver1静态静态aver&aver1&aver181返回指针值的函数void main()int n;float x=0,y=100,*p;printf(“in
3、put n:”);scanf(%d,&n);p=average(n,&x,&y);printf(ave=%6.2f,*p);printf(max=%6.2f,x);printf(min=%6.2fn,y);例例3-4 程序代码程序代码静态局部变量静态局部变量float *average(int n,float*max,float*min)int i;float s,*aver,sum=0;static float aver1;aver=&aver1;for(i=1;i*max)*max=s;if(s*min)*min=s;sum=sum+s;aver1=sum/n;return(aver);例
4、例3-5:编写一个编写一个alloc(n)函数,用来在内存区开辟函数,用来在内存区开辟n个字节的连续空间个字节的连续空间,该函数的返回值是一个指针该函数的返回值是一个指针,指向新开辟的空间的起始地址指向新开辟的空间的起始地址提示:先在内存申请一个相当大的连续空提示:先在内存申请一个相当大的连续空间间(如如1000个字节个字节),然后在此区域内进行开然后在此区域内进行开辟空间的操作。辟空间的操作。假设指针变量假设指针变量p原来指向未用空间的开原来指向未用空间的开头头,调用调用alloc(n)函数后函数后,开辟了开辟了n个字节供个字节供程序使用程序使用,而指针变量而指针变量p的值应变成的值应变成p
5、+n,同同时将新的时将新的p值返回值返回,表示可以利用从此位置表示可以利用从此位置开始的存储单元。开始的存储单元。如果要开辟的空间太大如果要开辟的空间太大,超过了预设的超过了预设的空间空间,则则alloc(n)函数应返回空指针函数应返回空指针NULL,表示开辟失败。表示开辟失败。buf0buf1 :buf20 :buf999p返回指针值的函数例例3-5 程序代码程序代码#include#include#define SIZE 1000char bufSIZE;char *p=buf;char *alloc(int n)char *begin;if(p+n=buf+SIZE)begin=p;p=
6、p+n;return(begin);else return(NULL);void main()char*p1,*p2;p1=alloc(10);strcpy(p1,”123456789”);p2=alloc(5);strcpy(p2,”abcd”);printf(“buf=%pn”,buf);printf(“p1=%pn”,p1);printf(“p2=%pn”,p2);puts(p1);puts(p2);for(int i=0;i15;i+)printf(“%c”,bufi);返回指针值的函数全局变量全局变量输出地址输出地址buf0buf1 :buf9buf10 :buf14buf15 :b
7、uf999bufp buf+10p1 p2 mainbeginn allocbufbufbuf+1012:90a:010buf+15beginn allocbuf+105char *alloc(int n)char *begin;if(p+n=buf+SIZE)begin=p;p=p+n;return(begin);else return(NULL);p1=alloc(10);p2=alloc(5);p是一是一个指针个指针数组数组,它有它有3个元素个元素,每个每个元素是一个整元素是一个整型指针变量型指针变量,可指向一个整可指向一个整型数据型数据l概念概念:一个数组的元素均为指针类型的数据,一个
8、数组的元素均为指针类型的数据,则该数组称为指针数组则该数组称为指针数组即:指针数组的每一个元素都是一个指针变量即:指针数组的每一个元素都是一个指针变量定义格式:定义格式:类型名类型名 *数组名数组名数组长度数组长度;int *p3;int x,y,a4;p0=&x;p1=&y;p2=a;xya0a1a2a3数组数组ap0p1p2指针数组指针数组p&x&ya指针数组指针数组指针数组用得最多的是指针数组用得最多的是“字符型指针数组字符型指针数组”,利用字符指针数,利用字符指针数组可以指向多个长度不等的字符串,使字符串处理起来更方便、组可以指向多个长度不等的字符串,使字符串处理起来更方便、灵活,节省
9、内存空间。灵活,节省内存空间。指针数组指针数组char*p4;p0p1p2p3Pascal0VC0Basic0Java0 定义一个定义一个4个元素的字符指针数组个元素的字符指针数组p,其其中每个数组元素是一个字符指针中每个数组元素是一个字符指针,可以可以指向一个字符串指向一个字符串指针数组指针数组例例2-4:编程将书名按字母顺序排序后输出编程将书名按字母顺序排序后输出方法方法1:用二维字符数组编程实现用二维字符数组编程实现P ascal0V C 0B asic0Java0B asic0Java0P ascal0V C 0排序排序思考:思考:二维字符数组定义成多大合适?二维字符数组定义成多大合适
10、?采用什么方法进行排序?采用什么方法进行排序?字符串怎样比较和交换?字符串怎样比较和交换?第一维的长度取决于有几本书第一维的长度取决于有几本书 第二维的长度由最长的书名决定第二维的长度由最长的书名决定 可使用冒泡排序或选择排序可使用冒泡排序或选择排序 字符串的比较和交换应使用相应字符串的比较和交换应使用相应的字符串函数的字符串函数#include#include#define MAXLEN 7#define N 4void main()int i,j;char tempMAXLEN;char nameNMAXLEN=Pascal,VC,Basic,Java;printf(before sort
11、ed:n);for(i=0;iN;i+)puts(namei);for(i=0;iN-1;i+)for(j=i+1;j0)strcpy(temp,namei);strcpy(namei,namej);strcpy(namej,temp);printf(nafter sorted:n);for(i=0;iN;i+)puts(namei);/书名的最大长度书名的最大长度+1/书的数量书的数量选择排序选择排序/输出排序前的书输出排序前的书名名/输出排序后的书输出排序后的书名名例例2-4:方法方法1:用二维字符数组编程实现的程序代码用二维字符数组编程实现的程序代码例例2-4:方法方法2:用指针数组编程
12、实现用指针数组编程实现p0p1p2p3Pascal0VC0Basic0Java0 p0p1p2p3Pascal0VC0Basic0Java0 注意注意:排序时是交换指针变量的指向排序时是交换指针变量的指向排序后排序后#include#include#define N 4void main()int i,j;char*temp=NULL;char*pN=Pascal,VC,Basic,Java;printf(nBefore sorted:n);for(i=0;iN;i+)puts(pi);for(i=0;iN-1;i+)for(j=i+1;j0)temp=pi;pi=pj;pj=temp;pri
13、ntf(nAfter sorted:n);for(i=0;iN;i+)puts(pi);交换的是字符串的交换的是字符串的起始地址起始地址 例例2-4:方法方法2:用指针数组编程实现的程序代码用指针数组编程实现的程序代码2100210721102116Pascal0VC0Basic0Java0 for(i=0;iN-1;i+)for(j=i+1;j0)temp=pi;pi=pj;pj=temp;例例2-4:方法方法2的过程演示的过程演示i=0,j=1P V temp2100210721102116i=0,j=2PBtemp=p0;p0=p2;p2=temp;2100p0p1p2p32110210
14、0i=0,j=3B J i=1,j=2VP temp=p1;p1=p2;p2=temp;210721002107i=1,j=3PJ temp=p1;p1=p3;p3=temp;i=2,j=3VP temp=p2;p2=p3;p3=temp;210021162100210721002107指向指针的指针指向指针的指针2026qint x,*q,*t;x=36;q=&x;t=&q;362010 x2048t20102026t即为指向指针的指针即为指向指针的指针(也称二级指针也称二级指针)思考:思考:q=45;*q=45;*t=56;*t=56;对对错错,因为因为q是指针变量,赋值号右侧必须是地址是
15、指针变量,赋值号右侧必须是地址错错,因为因为t是二级指针变量,是二级指针变量,*t等价于等价于q对对指向指针的指针指向指针的指针char*p4=Pascal,VC,Basic,Java;char*q;q=p;for(;qp+4;q+)puts(*q);p0p1p2p3Pascal0VC0Basic0Java0 pq思考:思考:int a34;int *p;p=a;int a34;int (*p)4;p=a;对对错错虽然在定义虽然在定义p的时只用的时只用了一个了一个*,但,但p实际上实际上是一个二级指针变量是一个二级指针变量虽然虽然a是二级地址,是二级地址,p是二级指针变量,但它们的含义不同是二
16、级指针变量,但它们的含义不同a指向的是一行整型数据指向的是一行整型数据,它包含它包含4个元素个元素p指向的是一个整型指针变量指向的是一个整型指针变量作业:习题习题10.12某班期末考试有门课程某班期末考试有门课程,班级人数不确定班级人数不确定,要求计算要求计算每个学生的总分和平均分每个学生的总分和平均分,按以下格式输出数据按以下格式输出数据NO.S1 S2 S3 SUM AVE 1 97 86 92 276 92 2 92 91 90 273 91 3 90 81 82 253 84 :要求要求:1.学生人数由键盘输入学生人数由键盘输入 2.编写输入函数输入学生的学号和编写输入函数输入学生的学号和3门课的成绩门课的成绩 3.编写函数计算每个学生的总分和平均分编写函数计算每个学生的总分和平均分 4.编写输出函数按格式输出数据编写输出函数按格式输出数据