




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022/7/18电气与信息工程学院计算机系制造Lesson 18 数据的组织构造2022/7/18电气与信息工程学院计算机系制造学习目的:31运用指针作为函数参数2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2例:将两个数从大到小输出要求: 经过运用函数的方法2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2void swap(int *p1, int *p2);int main() int a,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
2、(n%d,%dn,a,b);void swap(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; return ;.20002020202420042021200C2028202C2030.59整型变量a 整型变量b(main)指针pr_1指针p_220002004(swap)指针p1指针p2整型p5920002004COPY5做法1lesson18_01_1.c2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2void swap(int *p1, int *p2);int main() int a,b; int *p_1,*p_
3、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);void swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;.20002020202420042021200C2028202C2030.59整型a 整型b(main)p_1p_22000200420002002COPY(swap)指针p1指针p2指针p*2000地址传送20002004做法2lesson18_01_2.c2022/7/18电气与信息工程学院计算机系制造3指针作为函数
4、参数2例:从键盘输入10个数,输出最大值分析:定义一个函数,该函数前往最大值的地址2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2#include int * findMax(int * array,int len);void input(int array,int len);int main() int a10; int *max; input(a,10); max=findMax(a,10); printf(“最大值为=%d,*max); return 0; lesson18_02.c2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2int * fin
5、dMax(int *array,int len) int *p,* pmax=array; for(p=array;parray+len;p+) if(*pmax*p) pmax=p; return pmax; void input(int array,int len) int i; for(i=0;ilen;i+) scanf(“%d,array+i); return ; 请留意参数的定义和函数中的运用方式!2022/7/18电气与信息工程学院计算机系制造3指针作为函数参数2结论: 函数的形参是指针和函数的形参是 数组二者本质是一致的,都是传入的是一个地址2022/7/18电气与信息工程学院
6、计算机系制造3课堂练习2从键盘输入10个数,按从大到小的顺序输出分析: 在主函数中定义数组data10 调用input函数,给data数组输入值 从data0开场的10个变量的中最大值的地址(findMax函数),将其和data0交换(swap函数)从data1开场的9个变量的中最大值的地址(findMax函数),将其和data0交换(swap函数)从data2开场的8个变量的中最大值的地址(findMax函数),将其和data0交换(swap函数)直道data8为止调用output函数输出数组data的值循环2022/7/18电气与信息工程学院计算机系制造定义函数output,输出长度为l的
7、数组avoid output(int a,int l)int i;for(i=0;il;i+)printf(%4d,ai);return ;int * max(int *a,int l)int *maxp=a,i;for(i=0;il;i+)if(*maxp*(a+i)maxp=a+i;return maxp;定义函数max,找出长度为l的数组a中最大值的地址lesson_18_px.c2022/7/18电气与信息工程学院计算机系制造主函数int main()int data=1,4,6,7,0,8,2,10,12,9;int *mp,i,t;printf(排序前n);output(data,
8、10);for(i=0;i10;i+)mp=max(&datai,10-i);t=datai;datai=*mp;*mp=t;printf(排序后n);output(data,10);留意max(&datai,10-i)的写法2022/7/18电气与信息工程学院计算机系制造3二级指针3进一步了解指针int x=0;int * p;p=&x; 20000 xp2000变量p也有地址3000如何取变量p的地址&p2022/7/18电气与信息工程学院计算机系制造3二级指针3int x=0;int * p;p=&x; 20000 xp20003000保管变量p的地址?定义指针变量int * * pp;
9、 pp保管一个整型指针变量的地址!2022/7/18电气与信息工程学院计算机系制造3二级指针3int x=0;int * p;int * pp;p=&x;pp=&p 20000 xp20003000pp3000p*px*pp*pp2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4再来看二维数组int a34第个元素第个元素第个元素a0a1a22022/7/18电气与信息工程学院计算机系制造3指针与二维数组4a0这是一个一维数组怎样确定其中的元素?a01可以了解成a0即是该数组的称号2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4二维数组:一个元素为一维数组的一
10、维数组a0a1a22022/7/18电气与信息工程学院计算机系制造3指针与二维数组4再来看二维数组int a34a00a01a10a11a20a21a02a03a12a13a22a23内存是一维的所以二维数组也是可以了解成一个大的一维数组二维数组在内存中是按行存储问:a13,在数组中的第几个位置?aij呢?2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4#include int main() int a24=1,2,3,4,5,6,7,8; int *p,i; p= &a00; for (i=0; i8; i+) printf(%3d, *(p+i); if(i%4=0) p
11、rintf(n); 输出二维数组的值lesson18_a.c2022/7/18电气与信息工程学院计算机系制造aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020212032200020042021202420322036a00a01a10a11a20a21a02a03a12a13a22a23a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+1二维数组全了解2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4指针与二维数组的关系 假设有以下定义:#define ROWNUM 5#define COLNUM 4int aROW
12、NUMCOLNUM; int *ptr1; int (*ptr2)COLNUM;/*指针类型为intCOLNUM*/输出二维数组的每个元素内容2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4方法一:ptr1 = a0; for (i=0; iROWNUM; i+) for (j=0; jCOLNUM; j+) printf(%3d, *(ptr1+i*COLNUM+j); printf(n); lesson18_a2.c2022/7/18电气与信息工程学院计算机系制造3指针与二维数组4方法二:ptr2 = a; for (i=0; iROWNUM; i+) for (j=0;
13、 j=j;位于上三角元素的坐标特点是ij。2022/7/18电气与信息工程学院计算机系制造#include #define NUM 7int main( ) int aNUMNUM; int *ptr, i, j; /*构造下三角方阵*/ for (i=0; iNUM; i+) ptr = *(a+i); /*ptr指向第i行的第1个元素*/ for (j=0; j=j) *(ptr+j) = j+1; /*ptr+j指向ptr所指行的下标为j的元素*/ else *(ptr+j) = 0; 2022/7/18电气与信息工程学院计算机系制造/*输出下三角方阵*/ for (i=0; iNUM;
14、 i+) ptr = *(a+i); for (j=0; jNUM; j+) printf(%3d, *(ptr+j); printf(n); return 0;lesson18_03.c2022/7/18电气与信息工程学院计算机系制造3课堂练习2知有4个同窗的3门课程的成果,输出每门课程的最高分要求:1、定义函数findMax(int * a,int len),查找从a开场的后面len个变量的最大值的地址2、在主函数调用该函数输出最高分。2022/7/18电气与信息工程学院计算机系制造3指针数组5int a10int * d10 a是数组,元素类型为整型d是数组,元素类型为整型指针 d a
15、d0=&a0 d3=&a9 可以声明数组,其元素都是指针(指针数组) 相当于类型 2022/7/18电气与信息工程学院计算机系制造3指针数组5例4:在程序中有5种颜色,将其输出 #includeint main( ) int i; char *color5 = “red,“green, “yellow, “blue, “white; /* 初始化 */ for(i = 0; i = 4; i+) printf(%10sn, colori); return 0;lesson18_04.c2022/7/18电气与信息工程学院计算机系制造3指针数组5在程序中有5种颜色,将其输出 red0green0
16、yellow0blue0white02022/7/18电气与信息工程学院计算机系制造3数组的指针6我们还可以声明一个指针变量让它指向一个数组 int *p5;p就是一个指针,要指向一个含有5个int类型元素的数组,指向其他的就会出现问题。2022/7/18电气与信息工程学院计算机系制造3指针与字符串7字符串是一种以字符0作为终了标志的字符数组。表示字符串可以有下面几种方法:char str1 = “This is a C program.;char *str2 = “This is a C program.;char *str3 = (char*)malloc(sizeof(char)*25)
17、;strcpy(str3, str2);str1是一个含有21个元素的字符型数组,前20个元素用来存放字符序列“This is a C program.,最后一个元素存放字符串终了符0;str2是一个指向字符串常量的指针;str3指向一块动态恳求且可以放置25个字符的存储空间,调用strcpy() 函数的目的是将str2所指向的字符串常量复制到str3指向的存储空间中。2022/7/18电气与信息工程学院计算机系制造3指针与字符串7字符数组与字符指针的重要区别 char sa = This is a string;char *sp = This is a string;saThisisastr
18、ing0spThisisastring0假设要改动数组sa所代表的字符串,只能改动数组元素的内容假设要改动指针sp所代表的字符串,通常直接改动指针的值,让它指向新的字符串2022/7/18电气与信息工程学院计算机系制造3指针与字符串7字符数组与字符指针的重要区别 例如char sa = This is a string;char *sp = This is a string;strcpy (sa, Hello);sp = Hello;sa = “Hello; 非法数组名是常量,不能对它赋值2022/7/18电气与信息工程学院计算机系制造3变量与内存8#include int main()int
19、 a=1,b=2,c=3;int * p;p=&b;printf(%d,%d,%dn,*(p-1),*p,*(p+1);return 0;栈区abcp分析程序结果lesson18_c.c2022/7/18电气与信息工程学院计算机系制造3万能的指针8分析程序结果#include int main()int x=0 x434241;char * p;p=&x;printf(*p=%dn,*p);printf(%cn,*p);printf(%cn,*(p+1);printf(%cn,*(p+2);printf(%cn,*(p+3);return 0;lesson18_d.c0676665x2022/
20、7/18电气与信息工程学院计算机系制造3万能的指针8分析程序结果#include int main()int x=0 x434241;char c=A;float f=123.4;void * p;p=&x;printf(*p=%dn,*(int *)p);p=&c;printf(*p=%cn,*(int *)p);p=&f;printf(*p=%fn,*(float *)p);return 0;lesson18_e.c强迫类型转换2022/7/18电气与信息工程学院计算机系制造3藏有玄机的数组9分析程序结果#include int main()int b,a5,i;for(i=0;i=5;i
21、+)ai=i;printf(a0=%dn,a0);printf(a5=%dn,a5);printf(b=%dn,b);return 0;ba0a1a2a3a4a5i将a和b换个位置?lesson18_f.c2022/7/18电气与信息工程学院计算机系制造3动态内存分配10所谓动态是指在程序运转之后,再根据实践需求恳求相应的存储空间,这样既可以满足用户在确定所需的元素数量之后再恳求空间,也可以提高存储空间的利用率。 分块地方给程序运用2022/7/18电气与信息工程学院计算机系制造3动态内存分配101了解需求多少内存空间2利用C言语提供的动态分配函数来分配所需求的存储空间。3使指针指向获得的内存空间,以便用指针在该空间内实施运算或操作。4当运用终了内存后,释放这一空间。 2022/7/18电气与信息工程学院计算机系制造3动态内存分配10void *malloc(unsigned size) 在内存的动态存储区中分配一延续空间,其长度为size假设恳求胜利,那么前往一个指向所分配内存空间的起始地址的指针假设恳求内存空间不胜利,那么前往NULL值为0前往值类型:(void *)将malloc的前往值转换到特定指针类型,赋给一个指针 void * p;表示p是一个通用指针,运用可以保管恣意类型变量的地址,运用时,需求强迫转换成特定类型的指针类型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旧村改造项目可行性研究报告
- 机器设备购销合同
- 环保清洁能源供需分析
- 北京市农作物种子买卖合同BF2篇
- 部队司机安全培训内容课件
- 期中专题复习-词汇句型训练-2025-2026学年 译林版2024 英语七年级上册 解析卷
- 河南省三门峡市2024-2025学年高二上学期期末调研考试地理试卷(含答案)
- 2026届湖南省洪江市部分学校高三理科班9月份物理摸底考试试题(含解析)
- 20xx建行演讲稿(4篇)
- 多源文献融合与考证-洞察及研究
- 生殖细胞的发生
- 数字谜02-三上08-乘除法填空格
- 七块红烧肉阅读题目和答案-七块红烧肉初中语文课外阅读专练-记叙文阅读及答案
- 托班育儿知识讲座
- 流体力学在化工中的应用
- 配件紧急供货应急方案
- JJG 443-2023燃油加油机(试行)
- 安全生产责任保险事故预防技术服务方案
- IPv6技术与应用(华三版)电子教案项目1-15教学设计
- 古代汉语教程张世禄简体字版
- 高中英语-单词3500分类记忆
评论
0/150
提交评论