C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章 指针

上传人:E**** 文档编号:89370821 上传时间:2019-05-24 格式:PPT 页数:59 大小:1.22MB
返回 下载 相关 举报
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章  指针_第1页
第1页 / 共59页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章  指针_第2页
第2页 / 共59页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章  指针_第3页
第3页 / 共59页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章  指针_第4页
第4页 / 共59页
C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章  指针_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章 指针》由会员分享,可在线阅读,更多相关《C语言习题集与实验指导 教学课件 ppt 作者 伍鹏、杜红、王圆妹、邓绍金 第8章 指针(59页珍藏版)》请在金锄头文库上搜索。

1、8.1 指针和地址 8.2 指针变量的定义、初始化及使用 8.3 指针的运算 8.4 指针与数组及字符串 8.5 指针数组和多级指针 8.6 小结,第8章 指针,第8章 指针,正确熟练地使用指针可以编写简洁明快、性能强、质量高的程序。,指针是C语言中一种重要的数据类型。在C语言程序设计中,利用指针可以直接对内存中各种不同结构的数据进行快速处理,同时也为函数间各类数据的传递提供了便捷的方法。,了解指针与指针变量的特点; 掌握指针变量的定义及初始化; 掌握指针变量的引用; 掌握指针和数组、字符串之间的关系及操作; 理解指针的级别和两类特殊的指针。 掌握指针作为函数参数的定义和调用方法;,学习目标,

2、8.1 指针和地址,程序一旦被执行,则该程序中的指令、常量和变量等都要存放在计算机的内存中。 计算机的内存是以字节为单位的一片连续的存储空间,每个字节都有一个编号,这个编号就称为内存的地址。,内存和地址的关系,8.1 指针和地址,内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。 在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。 由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。 将地址形象化地称为“指针”,short a=3; int b=100; long int c=8; char d=a;,变量a,变量b,变量c,变量d,找到d的

3、地址1010,从而向存储单元赋值a,找到a的地址1000,从而向存储单元赋值3,1.变量的地址,图:变量内存分配示意图,2.指针变量:,例如:px为指针变量,x为普通变量,若将变量x的地址装入指针px的存储区域,则px的内容就是变量x的地址,(1)C语言中一种特殊性质的变量,即指针变量,专门用于存放地址的变量。,图:指针变量指向普通变量,8.2 指针变量的定义、初始化及使用,1. 指针变量的定义,指针变量定义的一般形式为:,存储类别 数据类型 *指针名;,例如: int *px; char *name; static int *pa; 定义了名字为 px、name和pa的三个不同类型的指针。,

4、可以缺省,auto, register,static,可以是基本类型,如int ,float,char,也可以是构造类型,取名规定与变量名相同,8.2 指针变量的定义、初始化及使用,2. 指针变量的初始化,指针变量初始化的一般形式为:,存储类别 数据类型 *指针名= 初始地址值;,例如: int *pa = &a; 把变量a的地址作为初值赋给int型指针pa。,注意:,(1)当把一个变量的地址作为初始值赋给指针变量时,该变量必须在指针初始化之前已经说明过。 (2)该变量的数据类型必须与指针的数据类型一致。,使用指针变量应注意以下几点:,(1)当把一个变量的地址作为初始值赋给指针变量时,该变量必

5、须在指针初始化之前已经说明过。,(2)该变量的数据类型必须与指针的数据类型一致。 例如:char cc; char *pc = ,(3)允许把一个已经初始化的指针赋予另一个指针. 例如: int n; int *p = ,(4) 指针变量中只能存放地址,不要将一个整型量赋给一个指针变量。下面的赋值是不合法的: int *pointer =1000;,【例8.1说明指针概念的程序。,#include “stdio.h“ int main( ) int a; int *pa = ,说明:上述输出结果中,后三行的结果每次运行时都有可能不一样,但第一行和第二行的输出值应该是相等的。,运行结果: a:1

6、0 *pa:10 &a:fff 4(HEX) pa:fff4(HEX) &pa:fff2(HEX),【例8.2】求地址量的数据长度的程序。,#include “stdio.h“ int main( ) char str =“abcdefghi“, *ps =str; int i =6,* pi = ,运行结果: (1) size of strings pointer is 4 byte =32 bits. (2) size of ints pointer is 4 bytes =32 bits. (3) size of floats pointer is 4 bytes =32 bits. (

7、4) size of doubles pointer is 4 bytes =32 bits.,8.2 指针变量的定义、初始化及使用,3. void指针,在C语言中还可以定义一种void型指针变量,用来指向一种抽象的数据类型,即定义一个指针变量,但不指明它指向哪种具体的数据类型,称为“无类型指针”。 指针变量定义的一般形式为:,存储类别 void *指针变量名;,8.2.2 指针变量的使用,(1) 取地址运算符符:,操作数:单目 优先级:2级 结合性:从右至左,说明:取地址运算符&的操作对象必须是左值表达式(即变量或有名存储区) 运算结果:为操作对象变量的地址,结果类型为操作对象类型的指针。,

8、例如,设变量说明为 int x;char y;double z; 则地址表达式&x、&y和&z的结果类型分别为int *(整型指针)、char *(字符型指针)和double* (双精度浮点型指针)。,8.2.2 指针变量的使用,(2)指针运算符: * (“间接访问”运算符),操作数:单目 优先级:2级 结合性:从右至左,说明:间接访问运算符*的操作对象必须是地址表达式,即指针(地址常量或指针变量) 运算结果:为指针所指的对象,即变量本身;结果类型为指针所指对象的类型。,例如,设变量说明为 char c,*pc =。,8.2.2 指针变量的使用,(3) *和&的运算关系,单目*和&互为逆运算,

9、它们之间的运算关系可表达为:,*(&左值表达式)=左值表达式 和 &(*地址表达式)=地址表达式,指针的正确用法:,首先:必须按被引用变量的类型说明指针变量; 其次:必须用被引用变量的地址给指针变量赋值;,例如:一个极为常见的错误: int *p; *p =5; ,错误出现,会发生什么情况? 如果运气好,则p的初始值会是一个非法地址,这样赋值语句会出错,从而终止程序。 如果运气不好,这个指针偶尔可能包含了一个合法的地址,接下来的事情就是位于那个位置的值被修改,这种类型的错误非常难捕捉。,正确的用法: int *p,a; p=,8.3 指针的运算,1. 指针的算术运算,p1 + n, p1 -

10、n, p1 +, + p1, p1-, -p1, p1 - p2,(1) 指针与整数的加减运算,意义:指针作为地址加上或减去一个整数n,等价于指针从当前指向位置加上或减去前方或后方第n个数据的位置。 注意:由于指针可以指向不同数据类型,即数据长度是不同的。,图8-3 指针加减整数运算的示意图,(2) 指针的+,-运算,意义:指针+运算后就指向了下一个数据的位置,-运算后就指向上一个数据的位置。 注意:由于指针可以指向不同数据类型,即数据长度是不同。,例:y =* + px; 它相当于 y =*( + px);,思考:y =(*px) +;与y =+(*px); 的区别,例:y =* + px;

11、 它相当于 y =*( + px);,思考:y =(*px) +;与y =+(*px); 的区别,例:一个指针运算用字符串复制函数的程序的例子。 char *strcpy( char *dest,char *src) char *temp = dest; while( (*dest +=*src +)!=0) ; /逐个复制字符,直到0 return temp; /返回目的字符串的首地址 ,【改写上面程序】 char *strcpy( char *dest,char *src) char *temp = dest; while( (*src )!=0) /判断如果没有到字符串结束处 *dest

12、 =*src; /逐个复制字符 dest+; src+; /两个指针分别下移一个位置 *dest =0; /添加一个字符串结束标志 return temp; /返回目的字符串的首地址 ,(3) 指针的相减,意义:设指针p和q是指向同一组数据类型相同的数据,则p-q运算的结果值是两指针指向的地址位置之间的数据个数。,【例8.3】统计输入字符串的字符个数的程序,#include “stdio.h“ int main( ) char s20,* p; printf (“Enter a string ( less than 20 characters):n“); scanf (“%s“, s); /输

13、入字符串 p = s; /将字符指针指向字符数组的首地址 while (*p! =0) /逐个移动字符指针直到字符串结束 p +; printf (“The string length:%d n“, p - s); / p - s 就是字符串的长度 return 0; ,运行结果: Enter a string ( less than 20 characters): abcdefghi The string length :9,【例8.3改写】用计数器的方法统计字符个数,#include “stdio.h“ int main( ) char s20,* p; int i=0; printf (

14、“Enter a string ( less than 20 characters):n“); scanf (“%s“, s); /输入字符串 p = s; /将字符指针指向字符数组的首地址 while (*p! =0) /逐个移动字符指针直到字符串结束 p +;i+; printf (“The string length:%d n“, i); return 0; ,2. 指针的关系运算,例如:p q,p = q,p= q等 指针的关系运算在指向数组的指针中广泛的运用,假设 p、q是指向同一数组的两个指针,执行pq的运算,其含义为,若表达式结果为真(非值),则说明p所指元素在q所指元素之后。或

15、者说q所指元素离数组第一个元素更近些。,3. 指针的赋值运算,(1)将变量地址值赋给指针变量 char c, *pc; pc = ,8.4 指针与数组及字符串,1. 指针与数组,一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中),例如: int a10; int *pa; pa = a; 或 pa = ,引用一个数组元素,可用下面两种方法: () 下标法: 如ai或pi () 指针法: 如*(a+i)或*(p+i) 其中a是数组名,p是指向数组元素的指针变量,其初值p=a,8.4 指针与数组及字符串,1. 指针与数组

16、,【例8.5】数组元素值分别为110,采用指针形式输出各数组元素,#include “stdio.h“ int main( ) int a10,*pa , i; for( i =0 ; i 10 ; i +) /数组元素赋值 ai = i +1; pa = a; /将指针指向数组的首地址 for( i =0 ; 10 ; i +) printf (“*(pa +%d):%dn“, i ,*( pa + i); for( i =0 ; 10 ; i +) printf (“*(pa +%d):%dn“, i ,*( pa+); /用指针的形式逐个输出数组元素内容 return 0; ,【例8.6】数组元素值分别为2,4,6,8,10,分

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

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

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