




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 指针,2,直接访问与间接访问,程序中:int x; int * p; x = 5; p = ,5,p,3000,直接访问,间接访问,30,3,为什么引入指针的概念,指针的主要应用: 指针作形参可以在子函数中修改实参变量的值 利用指针作形参可以使子函数有多于一个的返回值,4,【例8-1】编写一个的子程序,子程序的功能为交换两个变量的值,#include stdio.h void swap(int x, int y); void main(void) int a, b; printf(请输入交换的数值:); scanf(%d%d, ,5,【例8-1】编写一个的子程序,子程序的功能为交换两个
2、变量的值(改进),#include void swap(int *x, int *y); void main() int a, b; scanf(%d%d, ,6,void swap(int *x, int *y) int t; printf(n-swap-n); printf(x=%x,y=%xn, x, y); t = *x; *x = *y; *y = t; printf(-swap-nn); ,7,说明,在该例题中,我们利用指针作形参实现了修改实参变量的值。,8,例 编写函数求出二维整型数组中元素的最大值及其下标号,#include #define M 3 #define N 2 in
3、t maxarray(int aMN, int m, int n, int *pmaxi, int *pmaxj); void main() int aMN=1,2,3,4,5,6; int max, maxi, maxj; max = maxarray(a, M, N, ,9,int maxarray(int aMN, int m, int n, int *pmaxi, int *pmaxj) int i, j, max = a00; for(i=0; im; i+) for(j=0; jn; j+) if(maxaij) max = aij; *pmaxi = i; *pmaxj = j;
4、 return max; ,10,说明,在这个例子中,我们利用指针作形参可以使子函数有多于一个的返回值,11,-11-,ai *(a+i) pi *(p+i),数组元素表示法,数组元素地址表示法,12,下标法 main ( ) int a10; i; for (i=0;i10;i+) scanf(%d, ,数组名计算地址法 main ( ) int a10;i; for (i=0; i10; i+) scanf(%d, a+i); for (i=0; i10; i+) printf (%d,*(a+i) ); ,例:输入输出整型数组a的全部元素。(假有10个元素),指针法 main( ) in
5、t a10, i, *p ; p= ,13,【例】写一个函数,将包含n个元素的数组进行排序,void main() /*冒泡*/ int n=10, a10=3,2,4,5,6,8,9,25,21,10 ; int i, j, temp; for(i=0; iaj+1) temp = aj; aj = aj+1; aj+1 = temp; ,void sort(int a, int n),aj *(a+j),void sort(int * a, int n),if(*(a+j)*(a+j+1) temp = *(a+j); *(a+j) = *(a+j+1); *(a+j+1) = temp;
6、,14,二维数组与指针,例 int a34;,a2,a1,a0,即:a 等价 int i;,15,16,for (i=0; i2; i+) printf(a+%d = %x, i, a+i); printf(t *(a+%d)= %x, i, *(a+i); printf(t a%d= %x, i, ai); printf(t *(*(a+%d)= %dn, i, *(*(a+i); for (i=0; i2; i+) printf(a0+%d= %x, i, a0+i); printf(t *(a0+%d)= %dn, i, *(a0+i); ,a+0 = 13ff70 *(a+0)= 13
7、ff70 a0= 13ff70 *(*(a+0)= 1 a+1 = 13ff78 *(a+1)= 13ff78 a1= 13ff78 *(*(a+1)= 3 a0+0= 13ff70 *(a0+0)= 1 a0+1= 13ff74 *(a0+1)= 2,17,对于二维数组a22,指针常量a和a0是不同类型的指针。通过运行结果我们可以看到: 数组名a是指针常量,a的比例因子为1行指向二维数组的第0行; a0也是指针常量,比例因子为1个元素指向二维数组第0行第0个元素,17,*(a+0)和*(a+1) *(*(a+0)和*(*(a+1) *(a0+0)和*(a0+1) a0+2指向谁呢? a11有
8、多少表示法呢? *(a0+3)、*(a1+1) *(*(a+1)+1),例 int a22;,a0,a,18,例:求二维数组a34所有元素的和以及平均值。,main( ) int a34=1,2,3,4,5,6, 7,8,9,10,11,12; int i, sum=0,*p ; p= printf(“sum=%d,aver=%f”, sum,sum/12.0) ,19,8.6 指针与数组编程实例,【例8-7】数列的中位数是数列中按照数值大小排在中间位置的数。例如:数列1,2,3,4,5的中位数为3。 算法:先对数列排序,然后寻找排序序列的中位数。,19,20,#include void so
9、rt(int a, int n); void main() int ser100; int i, num; printf(Input length of serial:n); scanf(%d, ,21,void sort(int a, int n) int i, temp; int *p; for(i=0; i *(p+1) temp=*p; *p=*(p+1); *(p+1)=temp; ,21,Input length of serial: 5 input serial elements: 1 -3 23 67 15 The median of serial is 23,22,8.7 指
10、针与字符串,字符串表示形式 用字符数组实现,main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); ,I love China!,China!,23,main( ) char *cp=“I love China!”; printf(“%sn”, *cp); printf(“%sn”, cp); cp+=7; printf(“%sn”, cp); ,用字符指针实现,I I love China! China!,24,char string20= “I love China!”;,char
11、 *cp= “I love China!”;,aa00,25,字符型指针变量与字符数组 char str20; 与 char *cp; str由若干元素组成,每个元素放一个字符cp只是一个指针变量,存放字符串首地址 char str20; str=“I love China!”; char *cp; cp=“I love China!”; str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为:char *cp, str10; cp=st
12、r; scanf(“%s”,cp); (),26,char str=“Hello!”; char str=“Hello!”; char str=H,e,l,l,o,!; char *cp=“Hello”; int a=1,2,3,4,5; int *p=1,2,3,4,5; char str10, *cp; int a10, *p; str = “Hello”; cp = “Hello!”; a = 1,2,3,4,5; p = 1,2,3,4,5;, , ,分析下列用法正确与否,27,【例8-9】写程序,判断一个单词是否为回文。回文指的是单词按从前到后与从后到前的顺序读都相同,例如“leve
13、l”就是是一个回文单词。,#include #include #define MAXLEN 80 void main() char *str; int flag; int pal(char *); if (str = (char *) malloc(MAXLEN) ) = NULL) printf(Memory allocation error!n); exit(0); ,28,printf(Input a word:n); scanf(%s, str); while (*str != #) flag = pal(str); if (flag) printf(%s is a palindrom
14、e!n, str); else printf(%s isnt a palindrome!n, str); printf(Input a word:n); scanf(%s, str); free(str); ,29,int pal(char * str) /*判断回文*/ char *p, *q; p = str; q = str; while (*q != 0) /*p指向首部,q指向尾部*/ q+; q-; while (p = q); ,30,C语言字符串操作的库函数,1字符串连接函数strcat,char * strcat(char *s1, char *s2) char *p, *q
15、; p = s1; q = s2; while( *(p+1)!= 0 ) p+; while(*q!=0) *p = *q; p+; q+; *p = 0; return s1; ,31,C语言字符串操作的库函数,2字符串拷贝函数strcpy,char *strcpy(char *s1,char *s2) 功能:把字符串s2复制到字符串s1中。 例如: char str80; strcpy(str, abcd);,32,C语言字符串操作的库函数,3字符串比较函数strcmp int strcmp( char *s1,char *s2) 功能:按照字典排序方法比较字符串s1和字符串s2,返回值如下: (1) s1=s2,返回值0; (2) s1s2,返回值0; (3) s1s2,返回值0。 例如:char str1=”word”,str2=”world”; strcmp(str1,str2)的返回值小于0。,32,33,C语言字符串操作的库函数,4求字符串长度函数strlen size_t strlen(char *s) 功能:求字符串的实际长度(不含串结束标志0) 例如: int len; len=strlen(“hello”); /* len为5 */ len=strlen(“”); /* len为0 */,33
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长天科技java面试题及答案
- 航天社团考试题及答案
- 家长必看的考试题及答案
- 城管执法源头管理制度
- 技能培训考试题及答案
- 钢铁物流面试题及答案
- 中药熏洗加热敷治疗老年退行性膝关节骨性关节炎58例总结模版
- 儿童急性早幼粒细胞白血病的临床护理
- 新质生产力落实
- 我的百宝箱三等奖教学设计
- 艾滋病病人的心理护理
- 铁路旅客运输服务铁路客运车站服务工作课件
- 广东惠州事业单位招聘医疗卫生岗考试模拟题带答案2025年
- 《面试技巧与策略》课件
- 2023年贵州省粮食储备集团有限公司面向社会公开招聘工作人员15人笔试参考题库附带答案详解
- 公司注册合同协议
- 心功能分级课件
- 统编版一年级下册道德与法治第四单元学先锋做先锋第一课时教学设计
- 行为资产定价理论综述
- 2025年美丽中国第六届全国国家版图知识竞赛测试题库(中小学组)
- 至诚则成立信于行主题班会
评论
0/150
提交评论