C语言程序设计基础第8章指针.ppt

上传人:wuy****n92 文档编号:70741033 上传时间:2023-01-27 格式:PPT 页数:52 大小:259.99KB
返回 下载 相关 举报
C语言程序设计基础第8章指针.ppt_第1页
第1页 / 共52页
C语言程序设计基础第8章指针.ppt_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《C语言程序设计基础第8章指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计基础第8章指针.ppt(52页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、C语言程序设计基础第8章 指针刘新国1第8章 指针 变量、内存单元、地址指针类型定义、初始化、赋值、使用指针应用数据传递字符串处理内存分配数据遍历8.1.2 指针类型指针是一种新的数据类型存放变量的地址存放数据单元的地址 假设定义了变量 int x,*p;那么可将变量x的地址存在指针p中:p=&x;&是取地址运算符 canf(%d,&x)变量和数据单元地址1000p内存单元201155地址10001002100420002002xyzp=&x表达式*p和变量x指代同一个东西8.1.3 指针变量的定义 类型名 *指针变量名int *p;int *p;p p 是整型指针,是整型指针,可用来可用来指

2、向整型变量指向整型变量只能指向同类型的变量只能指向同类型的变量float*fp;float*fp;fp fp 是浮点型指针,是浮点型指针,可用来可用来指向浮点型变量指向浮点型变量double*q;double*q;q q 是字符型指针,是字符型指针,可用来可用来指向指向doubledouble变量变量char*cp;char*cp;cp cp 是字符型指针,是字符型指针,可用来可用来指向字符型变量指向字符型变量8.1.4 指针的基本运算 给指针赋值int a,x,*p;p=&a;访问指针所指向的变量*p=3;*p=5;x=*p;例8-2指针运算和访问int a=3,*p;p=&a;printf

3、(a=%d,*p=%dn,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(“Enter a:”);/*若输入5*/scanf(%d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);78.1.5 指针的变量的初始化 int a,x;int*p=&a;int*q=NULL;NULL是一个常量,值为0,表示空指针#define NULL 0int*q=0;float*fp=(float*)1732;8.2 变量交换swap函数实现void swap1(int x,int y)int tem

4、p=x;x=y;y=temp;void main()int a=1,b=2;swap1(a,b);能否成功交换变量a和b的值?98.2 变量交换swap函数实现void swap2(int*x,int*y)int*p=x;x=y;y=p;void main()int a=1,b=2;swap2(&a,&b);能否成功交换变量a和b的值?108.2 变量交换swap函数实现void swap3(int*x,int*y)int temp=*x;*x=*y;*y=temp;void main()int a=1,b=2;swap3(&a,&b);能否成功交换变量a和b的值?118.2.2 指针作为函数

5、的参数void swap2(int*x,int*y)int temp=*x;*x=*y;*y=temp;void main()int a=1,b=2;swap2(&a,&b);传递结果改变主调函数的变量值12例8-4编写函数,计算某年某天对应的月份和日期函数的输入参数:年份,天数int year,int yearday例如2008年的第128天,year=2008,yearday=128函数的输出结果:月份,日期结果不止一个,无法用返回值可以用指针变量int*pmonth,int*pday函数原型:void month_day(int year,int yearday,int*pmonth,i

6、nt*pday);13例8-4计算某年某天对应的月份和日期void month_day(int year,int yearday,int*pmonth,int*pday)int k,leap;int tab 213=0,31,28,31,0,31,29,31;/*闰年判别leap*/leap=(year%4=0&year%100!=0)|year%400=0;for(k=1;yearday tableapk;k+)yearday-=tableapk;*pmonth=k;*pday=yearday;148.3 指针与数组数组名实际上代表了一个指针它指向数组的首元素 int a100;那么a就是一

7、个指针,存储了a0的地址。数组名是一个指针常量不能改变它的地址值 int a100,c,*p;a=&c;/*不可以*/p=a;/*可以*/158.3 指针与数组int a100;int*p=a;指针p的地址值为3000假设整数为2个字节长指针p+1的地址值为3002指针p+i的地址值为3000+2i p+i=a+i (都指向a的第i个元素)指针的加法:指针+整数n结果:将指针往后移动n个单元即:地址值增加了n*sizeof(数据类型)a1aia99a0内存单元内存单元内存地址内存地址30023000+2i31983000指针比较与减法两指针可以比较大小其结果等价于比较它们地址的大小两同类型指针

8、可相减其结果等于它们之间所能存储的数据个数即:p地址-q地址 pq=-sizeof(类型)double a10,*p,*q;p=a;q=&a4;q-p 等于多少?4(int)q(int)p 等于多少?328.3 指针与数组int a100;指针a指向首元素a0;指针a+i指向元素ai;表达式ai等价于 *(a+i)a1aia99a0内存单元内存单元内存地址内存地址30023000+2i31983000例8-5冒泡排序把最大值放到数据的最后对剩下的数据进行重复处理-流程整体上和选择法排序一样-区别在于如何把最大值放到最后19例8-5冒泡排序void bubble(int a,int n)/*vo

9、id bubble(int*a,int n)*/int i,j,t;for(i=1;in;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;在a0,a1,aj中aj最大交换,使得aj+1在a0,a1,aj+1中最大20例8-5冒泡排序void main()int n,a8;/*输入 n 和 n个值到数组a中*/bubble(a,n);/*输出排序后的数组a*/将数组a的首地址作为参数传给函数bubble218.3.3 数组名作为函数参数int sum(int a,int n)/*int a是形式参数int*a的等价写法)*/int i,s;for(s=0,i=0;in;

10、i+)s+=ai;return s;228.3.3 数组名作为函数参数int sum(int a,int n)/*int a等价int*a*/int i,s;for(s=0,i=0;in;i+)s+=ai;return s;假设有int b100;那么:sum(b,100)的结果是 b0+b1+b99sum(b,88)的结果是 b0+b1+b87sum(b+7,9)的结果是 b7+b8+b15sum(&b7,9)的结果也是是 b7+b8+b1523例8-7编写函数将数组逆序void reverse(int a,int n)int i,k,t;for(i=0,k=n-1;ik;i+,k-)t=a

11、i,ai=ak,ak=t;void main()int a10,k;for(k=0;k10;k+)ak=k;reverse(a+1,9);for(k=0;k10;k+)printf(%d,ak);输出为:0 9 8 7 6 5 4 3 2 1248.4 简单的加密问题 void entrypt(char*s)for(;*s;s+)*s=*s=z?a:*s+1;void main()char pwd100;gets(pwd);entrypt(pwd);printf(pwd);如果输入为:Hello Hangzhou那么输出为:Ifmmp!Ibohaipv字符串结束标志0字符数组字符指针8.4.2

12、 字符串和字符指针 字符串常量arraypoint用一对双引号括起来的字符序列 被看做一个特殊的一维字符数组,在内存中连续存放 实质上是一个指向该字符串首字符的指针常量char*sp=point;8.4.2 字符串和字符指针字符串常量char sa=array;char*sp=point;printf(%s,sa);printf(%s,sp);printf(%s,string);printf(%c,string5);输出为:array point string g用字符串常量初始化字符数组用一个字符串常量的地址初始化一个指针printf(%s,sa+2);printf(%s,sp+3);pri

13、ntf(%s,string+1);输出为:ray nt tring字符串常量是表达式其值为一个指针,指向存储它的地址8.4.2 字符串和字符指针char sa=array;定义了一个数组,并被初始化为array0char*sp=point;定义了一个指针sp,而非数组。指针指向了一个字符串常量,而该字符串常量存储在何处呢?Somewhere decided by the system.8.4.2 字符串和字符指针字符串输出 char*p;puts(p);printf(%s,p);要求指针p指向了一个以0结尾的字符串字符串输入 gets(p);scanf(%s,s);要求指针p所指的地方具有足够

14、的free存储空间。否则,程序崩溃8.4.3 常用的字符串处理函数gets/scanfgets函数读入一整行(包括空格),直到回车为止scanf函数读入字符,直到空格和回车为止puts/printfputs函数输出后会自动换行8.4.3 常用的字符串处理函数strcpy(char*s,char*t)字符串复制:s=tstrcat(char*s,char*t)字符串连接:s+=tstrcmp(char*s,char*t)字符串比较:s tstrcmp(abc,aba)的结果大于0strcmp(abc,abcd)的结果小于0strcmp(abc,abc)的结果等于08.4.3 常用的字符串处理函数

15、strlen(char*s)字符串的长度(不包括0)strlen(abc,aba)的结果是3#include 或者#include 8.4.3 常用字符串处理函数 实现参考char*strcpy(char*s,char*t)do *s+=*t;while(*t+);return s;8.4.3 常用字符串处理函数 实现参考char*strcat(char*s,char*t)while(*s)s+;strcpy(s,t);return s;8.4.3 常用字符串处理函数 实现参考int strlen(char*s)char*p=s;while(*p)p+;return(p-s);8.4.3 常用

16、字符串处理函数 实现参考char*strcmp(char*s,char*t)while(*s=*t&*s)s+,t+;return(*s-*t);8.4.3 常用字符串处理函数 实现参考int strlen(char*s)char*p=s;while(*p)p+;return(p-s);8.4.3 常用字符串处理函数假设strlen(s)等于20,那么strlen(s+5)等于几?15如果有字符串s为“hello”,字符串t为“world”,那么strcat(s,t)是?helloworld strcat(s+1,t+1)是?elloorld8.4.3 常用字符串处理函数执行strcpy(s,

17、good0morning)后,字符指针s所指向的字符串为 good下列语句能够正确执行吗?strcpy(old string,new);不能改变字符串常量8.5 动态内存申请和使用数组的局限大小固定、使用不灵活预定义的数组容量通常比较小动态分配内存根据运行情况,按需分配例8-12 数据输入和求和输入一个整数n,以及n个整数,计算它们的和。#include#includeint n,sum,i,*p;scanf(%d,&n);p=(int*)calloc(n,sizeof(int);p=(int*)calloc(n,sizeof(int);例8-12 数据输入和求和/*检查内存申请结果*/if(

18、p=NULL)/*等价于 if(!p)*/*输出一些信息,作为错误提示*/printf(Not able to allocate memoryn);return;例8-12 数据输入和求和/*输入n个整数*/for(i=0;in;i+)scanf(%d,p+i);/*&pi*/*求和*/for(sum=0,i=0;in;i+)sum+=pi;/*(p+i)*/printf(sum=%dn,sum);例8-12 数据输入和求和/*释放内存*/free(p);8.5.2 用指针实现内存动态分配包含头文件#include 或者#include 8.5.2 用指针实现内存动态分配调用内存分配函数voi

19、d*calloc(unsigned n,unsigned size)参数 n 包含的元素个数 参数 size 每个元素所占的字节数 (总的内存大小为 n*size 字节)返回值 无类型指针 指向所分配的内存地址void 无类型void*无类型指针void*可以强制转化为任何类型的指针8.5.2 用指针实现内存动态分配void*malloc(unsigned size)参数 size 申请内存的字节数 (总的内存大小为 size 字节)返回值 无类型指针 指向所分配的内存地址假设你的数据类型为UType,那么调用步骤如下:UType*p;p=(UType*)malloc(元素个数*sizeof(

20、UType);if(!p)/*检查分配是否成功*/*处理错误*/8.5.2 用指针实现内存动态分配然后就可以如普通数组一样使用p使用完成之后,释放内存 free(p);8.5.2 用指针实现内存动态分配使用过程中如果发现内存不够多(或者多了),还可以动态调整 void*realloc(void*p,unsigned size)指针p 必须是指向动态申请的内存,否则出错 size为新的大小如果调整成功,返回新的地址,并将原地址的内容复制到新地方否则,返回NULL。8.5.2 内存动态调整int count=0;float*pbuf=NULL;int bufsize=0,delta=1000;in

21、t checkbuf()void*p=NULL;if(countbufsize)retrun 1;p=realloc(pbuf,(bufsize+delta)*sizeof(float);if(!p)return 0;pbuf=(float*)p;bufsize+=delta;retrun 1;8.5.2 内存动态调整int addToBuf(float v)if(!checkbuf()return 0;pbufcount+=v;return count;本章要点变量、内存单元和地址之间是什么关系?如何定义指针变量,怎样才能使用指针变量?什么是指针变量的初始化?指针变量的基本运算有哪些?如何使用指针操作所指向的变量?指针作为函数参数的作用是什么?如何使用指针实现函数调用返回多个值?如何利用指针实现内存的动态分配?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com