c语言从入门到精通第12章.ppt

上传人:小飞机 文档编号:6503770 上传时间:2023-11-07 格式:PPT 页数:41 大小:324.99KB
返回 下载 相关 举报
c语言从入门到精通第12章.ppt_第1页
第1页 / 共41页
c语言从入门到精通第12章.ppt_第2页
第2页 / 共41页
c语言从入门到精通第12章.ppt_第3页
第3页 / 共41页
c语言从入门到精通第12章.ppt_第4页
第4页 / 共41页
c语言从入门到精通第12章.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《c语言从入门到精通第12章.ppt》由会员分享,可在线阅读,更多相关《c语言从入门到精通第12章.ppt(41页珍藏版)》请在三一办公上搜索。

1、第12章指针的深入研究指针进阶,指针与数组 指针与字符串 综合应用报数游戏 跟我上机,第12章指针的深入研究指针进阶,指针与数组 指针与字符串 综合应用报数游戏 跟我上机,第12章指针的深入研究指针进阶,指针与数组 指针与字符串 综合应用报数游戏 跟我上机,第12章指针的深入研究指针进阶,指针与数组 指针与字符串 综合应用报数游戏 跟我上机,第12章指针的深入研究指针进阶,指针与数组 指针与字符串 综合应用报数游戏 跟我上机,12.1 指针与数组,12.1.1 指针与数组12.1.2 数组名作为指针12.1.3 指针与多维数组12.1.4 指针与数组参数,12.1.1 指针与数组,指针用于存储

2、地址,他和数组名紧密的联系在一起。下图就显示了一个数组名称为grade,包含5个整型数据的一维数组,这里每个整型元素占用4个字节。,12.1.1 指针与数组,访问数组元素,我们可以使用下标来实现,比如我们要访问数组元素grade3,在之前的章节里我们详细的讲解过,但是那时使用的方法其实隐藏了数组每一个元素的地址。根据之前讲过的地址的概念,加之我们已知的数组的特点,这个特点就是数组在内存总占用一块连续的存储区域,这样的话,如果我们知道数组的首地址,针对grade这个数组,就是已知grade0的地址,我们就可以通过增减偏移量,得到garde3的地址,从而访问到garde3的元素值,12.1.1 指

3、针与数组,12.1.1 指针与数组,【范例12-1】使用指针访问数组元素,分别使用下标和指针访问数组元素01#include 02 int main(void)03 04 int i;05 int grade=2,5,9,4,6;06 int*p;07 p=15,12.1.1 指针与数组,需要注意的是*(p+i)表达式中的括号是必须有的,不能省略,如果我们遗漏了小括号,将变成这样的表达式*p+i,它的含义之前在指针变量处已经进行了讲解,是在p所指向的存储单元的数值基础上在i,因为我们始终没有改变指针p的指向。,12.1.2 数组名作为指针,每个创建的数组,数组名就成为编译器为这个数组所创建的指

4、针常量名称,存储的是数组第一个元素的起始地址,也是我们所说的数组首地址。这样,我们就有多了一种获取数组元素地址的手段。如【范例12-1】中代码“p=”。,12.1.2 数组名作为指针,【范例12-2】使用数组名作为指针访问数组元素。01#include 02 int main(void)03 04 int i;05 int grade=2,5,9,4,6;06 int*p;07 p=grade;/*指针赋值*/08 printf(使用数组名访问数组元素:n);09 for(i=0;i5;i+)/*使用数组名*/10 printf(数组grade的第%d个元素是%dn,i,*(grade+i);

5、11 printf(使用数组指针访问数组元素:n);12 for(i=0;i5;i+)/*使用指针变量*/13 printf(数组grade的第%d个元素是%dn,i,*(p+i);14 return 0;15,12.1.2 数组名作为指针,面的代码大家一起来分析一下,看看错了吗?grade=grade+3;结果是有误。原因是,grade是数组名,它是编译器为这个数组创建的指针常量,常量当然是不能够再赋值的。再看下面的代码,是否有问题?p=grade;p=p+3;结果是正确的。原因是,p是指针变量,它初始值是grade数组的首地址,之后根据需要修改了p的值,也就是改变了指针变量p的指向。,12

6、.1.2 数组名作为指针,【范例12-3】已知一个含有10整型元素的一维数组array,使用指针,求出该数组的最大值,最小值和平均值,并输出。,12.1.2 数组名作为指针,【范例12-4】有n个整数,存储在数组array中,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数,并输出。,12.1.3 指针与多维数组,我们知道数组在内存中用连续的存储区域,这一点已经反复提到,我们以二维数组为例,数据是怎么存储的呢?假设存在二维数组array23,那么这6个数据在内存中按照行走Z形排列,在内存储中存储形式如下图所示。,12.1.3 指针与多维数组,多维数组的数组名也被编译器创建为常量,用

7、来存储该数组的首地址。数组名array存储的是array00元素的地址,也就是存储的值是&array00。我们也可以按照首地址加偏移量的形式,从而使指针指向该数组中任何一个元素,实现多维数组和指针的关联。,12.1.3 指针与多维数组,下面我们逐步细分,让大家掌握。第一步,我们写出最容易理解的形式:array12/*指的是一个元素*/&array12/*指的是array12元素的地址*/然后,我们深入一步:array/*指的是数组下标为0的那一行的首地址*/array+1/*指的是数组下标1的那一行的首地址*/&array1/*指的也是数组下标1的那一行的首地址*/,12.1.3 指针与多维数

8、组,接下来,我们进一步深入:array1/*等价array1+0,于指的也是array10元素的地址*/array1+2/*指的也是array12元素的地址*/*(array+1)+2/*指的也是array12元素的地址*/最后:*(*(array+1)+2)/*指的是元素array12值*/*(array1+2)/*指的是元素array12值*/,12.1.3 指针与多维数组,【范例12-5】使用指针访问二维数组,12.1.4 指针与数组参数,1.第一种情况:实参是数组,形参也是数组主调函数:int arr10;function(arr);被调函数:function(int arr).,12

9、.1.4 指针与数组参数,2.第二种情况:实参是数组,形参是数组指针主调函数:int arr10;function(arr);被调函数:function(int*p).,12.1.4 指针与数组参数,3.第三种情况:实参是数组指针,形参是数组指针。主调函数:int arr10;int*p=arr;function(p);被调函数:function(int*q).,12.1.4 指针与数组参数,4.第四种情况:实参是数组指针,形参是数组。主调函数:int arr10;int*p=arr;function(p);被调函数:function(int arr).,12.1.4 指针与数组参数,【范例1

10、2-6】统计在array字符串中从a到z的26个小写字母各自现的次数。例如:输入字符串“abcdefgabcdeabc”,输出的结果应该是“3 3 3 2 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0”,12.2 指针与字符串,12.2.1 使用指针创建字符串12.2.2 使用指针处理字符串12.2.3 指针的指针12.2.4 指针数组和数组指针,12.2.1 使用指针创建字符串,字符串的定义自动就包含指针,例如,我们定义message1100;为100个字符声明存储空间,并自动的创建一个包含指针常量message1,是存储的是message10的

11、地址。跟一般的常量一样,指针常量指向是明确的,不能被修改。对于字符串,我们可以不按照声明一般数组的方式,定义数组维数和每一维的个数,还可以使用新的方法,也就是我们要讲解的用指针创建字符串。例如下面的代码:char*message2=how are you?;这个message1和message2是不同的,message1是按照数组定义方式定义的,如:char message1100=how are you?;,12.2.1 使用指针创建字符串,这种形式要求,message1有固定的存储该数组的空间,而且,因为message1本身是数组名称,一旦被初始化后,再执行下面的语句就是错误的,如mess

12、age1=fine,and you?;message2本身就是一个指针变量,它通过显式的方式明确了一个指针变量,对于message2执行了初始化后,再执行下面的代码是正确的,message2=fine,and you?;从分配空间的角度来分析,二者也是不同的。message1指定了一个存储100个字符位置的空间,而对于message2就不同了,它只能存储一个地址,它只能保存指定字符串的第一个字符的地址。,12.2.1 使用指针创建字符串,【范例12-7】八进制转十进制。01#include 02 int main(void)03 04 char*p,s6;05 int n;06 n=0;07

13、p=s;/*字符指针p指向字符数组s*/08 printf(输入你要转换的八进制数:n);09 gets(p);/*输入字符串*/10 while(*(p)!=0)/*检查指针是否都字符数组结尾*/11 12 n=n*8+*p-0;/*八进制转十进制计算公式*/13 p+;/*指针后移*/14 15 printf(转换的十进制是:n%dn,n);16 return 0;17,12.2.2 使用指针处理字符串,【范例12-8】字符串复制01#include 02 int main(void)03 04 char str110,str210;05 char*p1,*p2;06 p1=str1;07

14、 p2=str2;08 printf(请输入原字符串:n);09 gets(p2);10 for(;*p2!=0;p1+,p2+)/*循环复制str2中的字符到str1*/11*p1=*p2;12*p1=0;/*str1结尾补0*/13 printf(原字符串是:%sn复制后字符串是:%sn,str2,str1);14 return 0;15,12.2.2 使用指针处理字符串,这道题目声明了两个字符串的指针,通过指针移动,赋值字符串str2中的字符到str1,并且在str1结尾添加了字符串结束标志。需要说明以下两点:如果题目中没有使用指针变量,而是直接在for循序中使用了str1+这样的表达式

15、,程序就会出错,因为str1是字符串的名字,是常量;如果没有写*p1=0;这行代码,输出的目标字符串长度是9位,而且很可能后面的字符是乱码,因为str1没有结束标志,直至遇见了声明该字符串时设置好的结束标志“0”。,12.2.2 使用指针处理字符串,【范例12-9】字符串连接。,12.2.2 使用指针处理字符串,【范例12-10】已知一个字符串,使用返回指针的函数,实现这样的功能,把该字符串中的“#”号删除,同时把后面连接的字符串前移。,12.2.3 指针的指针,【范例12-11】使用指针的指针访问字符串数组。01#include 02 int main(void)03 04 char*arr

16、ay=Winter,Spring,Summer,Fall;05 char*p;/*指针的指针*/06 int i;07 for(i=0;i4;i+)08 09 p=array+i;/*指针的指针p指向array+i所指向的字符串的首地址*/10 printf(%sn,*p);/*输出数组中的每一个字符串*/11 12 return 0;13,12.2.3 指针的指针,12.2.4 指针数组和数组指针,什么是指针数组呢?指针数组是指数组由指针类型的元素组成。比如:int*p10。这里数组p是由10个指向整型元素的指针组成的,比如p0就是一个指针变量,它的使用跟一般的指针用法一样,无非是这些指针有

17、同一个名字需要使用下标来区分。例如我们有下面的定义:char*p2;char array220;p0=array0;p1=array1;如下图所示。,12.2.4 指针数组和数组指针,数组指针,比如:int(*p)10。指针p用来指向含有10个元素的整型数组。【范例12-12】使用数组指针。01#include 02 int main(void)03 04 int array23=1,2,3,4,5,6;05 int i,j;06 int(*p)3;07 p=array;/*p指向array下标为0那行的首地址*/08 for(i=0;i2;i+)09 10 for(j=0;j3;j+)11

18、printf(array%d%d=%dn,i,j,pij);12 13 return 0;14,12.3 综合应用报数游戏,【范例12-13】有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的那位是原来的第几号。,12.5 跟我上机,1.编写C程序,使用指针,实现以下功能:编一个函数fun(char*s),函数的功能是把字符串中的内容逆置。如:字符串中原有的内容为:abcdefg,则调用该函数后,串中的内容为:gfedcba,12.5 跟我上机,2.编写C程序,使用指针,实现以下功能:统计“ABCEJFAHADBDEBBFQPMDNBB”字符串中字母B的个数;移除所有字符“B”,后面所跟的字符串;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号