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

上传人:san****019 文档编号:70890792 上传时间:2019-01-18 格式:PPT 页数:41 大小:406.81KB
返回 下载 相关 举报
c语言从入门到精通第12章_第1页
第1页 / 共41页
c语言从入门到精通第12章_第2页
第2页 / 共41页
c语言从入门到精通第12章_第3页
第3页 / 共41页
c语言从入门到精通第12章_第4页
第4页 / 共41页
c语言从入门到精通第12章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《c语言从入门到精通第12章》由会员分享,可在线阅读,更多相关《c语言从入门到精通第12章(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的元素值

3、,12.1.1 指针与数组,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 print

5、f(“数组grade的第%d个元素是%dn“,i,*(grade+i); 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; 结果是正确的。原

6、因是,p是指针变量,它初始值是grade数组的首地址,之后根据需要修改了p的值,也就是改变了指针变量p的指向。,12.1.2 数组名作为指针,【范例12-3】 已知一个含有10整型元素的一维数组array,使用指针,求出该数组的最大值,最小值和平均值,并输出。,12.1.2 数组名作为指针,【范例12-4】有n个整数,存储在数组array中,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数,并输出。,12.1.3 指针与多维数组,我们知道数组在内存中用连续的存储区域,这一点已经反复提到,我们以二维数组为例,数据是怎么存储的呢?假设存在二维数组array23,那么这6个数据在内存中按

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

8、rray+1 /*指的是数组下标1的那一行的首地址*/ &array1/*指的也是数组下标1的那一行的首地址*/,12.1.3 指针与多维数组,接下来,我们进一步深入: 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

9、指针与数组参数,1. 第一种情况:实参是数组,形参也是数组 主调函数: int arr10; function(arr); 被调函数: function(int arr) .,12.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 指针

10、与数组参数,4. 第四种情况:实参是数组指针,形参是数组。 主调函数: int arr10; int *p=arr; function(p); 被调函数: function(int arr) .,12.1.4 指针与数组参数,【范例12-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 指针的

11、指针 12.2.4 指针数组和数组指针,12.2.1 使用指针创建字符串,字符串的定义自动就包含指针,例如,我们定义message1100;为100个字符声明存储空间,并自动的创建一个包含指针常量message1,是存储的是message10的地址。跟一般的常量一样,指针常量指向是明确的,不能被修改。 对于字符串,我们可以不按照声明一般数组的方式,定义数组维数和每一维的个数,还可以使用新的方法,也就是我们要讲解的用指针创建字符串。例如下面的代码: char *message2=“how are you?“; 这个message1和message2是不同的,message1是按照数组定义方式定义

12、的,如: char message1100= “how are you?“;,12.2.1 使用指针创建字符串,这种形式要求,message1有固定的存储该数组的空间,而且,因为message1本身是数组名称,一旦被初始化后,再执行下面的语句就是错误的,如 message1= “fine,and you?“; message2本身就是一个指针变量,它通过显式的方式明确了 一个指针变量,对于message2执行了初始化后,再执行下面的代码是正确的, message2= “fine,and you?“; 从分配空间的角度来分析,二者也是不同的。message1指定了一个存储100个字符位置的空间,

13、而对于message2就不同了,它只能存储一个地址,它只能保存指定字符串的第一个字符的地址。,12.2.1 使用指针创建字符串,【范例12-7】 八进制转十进制。 01 #include 02 int main(void) 03 04 char *p,s6; 05 int n; 06 n=0; 07 p=s; /*字符指针p指向字符数组s*/ 08 printf(“输入你要转换的八进制数:n“); 09 gets(p); /*输入字符串*/ 10 while(*(p)!=0) /*检查指针是否都字符数组结尾*/ 11 12 n=n*8+*p-0; /*八进制转十进制计算公式*/ 13 p+;

14、/*指针后移*/ 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 p2=str2; 08 printf(“请输入原字符串:n“); 09 gets(p2); 10 for (; *p2!=0;p1+,p2+) /*循环复制str2中的字符到str1*/ 11 *p1=*p2; 12 *p1=0; /*str1

15、结尾补0*/ 13 printf(“原字符串是 :%sn复制后字符串是:%sn“,str2,str1); 14 return 0; 15 ,12.2.2 使用指针处理字符串,这道题目声明了两个字符串的指针,通过指针移动,赋值字符串str2中的字符到str1,并且在str1结尾添加了字符串结束标志。需要说明以下两点: 如果题目中没有使用指针变量,而是直接在for循序中使用了str1+这样的表达式,程序就会出错,因为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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号