第8章 指针、结构体与共用体1.pptx
《第8章 指针、结构体与共用体1.pptx》由会员分享,可在线阅读,更多相关《第8章 指针、结构体与共用体1.pptx(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程主讲人:第8章 指针、结构体与共用体1C语言程序设计3C语言程序设计(第二版)4第8章 指针、结构体与共用体1本章通过一个简单的案例引入,介绍了指针的基本概念、指针运算、指针与数组等内容。2同时也重点介绍结构体、共用体、枚举等各种复合数据类型的定义及使用方法,介绍了使用typedef重新定义类型名的方法。5第8章 指针、结构体与共用体知识点:指针的概念和使用。指针的运算。指针和数组的关系。结构体的概念、定义和使用。结构体数组和结构体指针。共用体的概念、定义和使用。枚举的概念、定义和使用。使用typedef重新定义类型名。技能点:能熟练掌握Dev-C+集成环境的操作步骤。6第8章 指针、结构
2、体与共用体8.1 案 例 引 入【例8-1】使用结构数组表示学生成绩,使用结构数组的初始化来代替手工数据录入,实现计算学生平均成绩和统计不及格人数的功能,并显示不及格学生的姓名。任务分析:要完成题目要求,需定义一个结构体和定义结构数组,并计算及显示题目所要求的数据。此题需学习指针和结构体等知识点。7第8章 指针、结构体与共用体程序代码:打开链接8第8章 指针、结构体与共用体8.2 指 针8.2.1 地址和指针1地址在执行程序时,程序中定义的变量在内存中占据一定的存储单元,用于存放变量的数据。编译系统根据变量定义时指定的数据类型确定该变量所占据的存储单元数量以及数据在存储单元中存放的形式。在程序
3、中,用变量名引用变量值,或引用变量的存储位置(例如scanf中的&)。9第8章 指针、结构体与共用体在对应的目标程序中,源程序访向变量的变量名,就已经被转换成变量的实际存储地址,按变量的地址引用值或赋值,所以源程序中的变量名是其存储空间的抽象。变量名和实际存储空间的映射关系如图8-2所示。 图8-2 变量名与内存单元地址的对应关系10第8章 指针、结构体与共用体从图8-2中可以看到,计算机的内存储器就像一个巨大的一维数组,每个数组元素就是一个存储单元(一个字节);类似每个数组元素的下标,每个内存单元都有一个编号(无符号整数),称为该单元的地址;内存单元的地址与所定义的变量是一一对应的,保证了引
4、用该变量的值时不会发生错误。11第8章 指针、结构体与共用体变量的数据类型决定变量所占内存单元的大小,即占用几个连续的字节空间,对应当前变量的第一个字节的内存地址,就是该变量的内存地址(int类型的变量在Turbo C中占两个字节,在Dev-C+中占4个字节)。12第8章 指针、结构体与共用体如果在不同的平台要知道各种数据类型的大小,可以用以下语句来测试:printf(%dn,sizeof(数据类型);例如:printf(%dn,sizeof(int);在Dev-C+系统中,打印输出的值为4,表示int数据类型占用4个字节的宽度。13第8章 指针、结构体与共用体2指针变量一旦获得编译系统为其分
5、配的存储单元,该存储单元的起始字节的编号就称为该变量的地址或指针,即指针就是变量的存储地址。如图8-2所示,2000是变量i的地址,也叫i的指针,2002就是变量j的指针。14第8章 指针、结构体与共用体8.2.2 声明指针变量在定义指针变量时,需要用指针运算符“*”表示变量是用来存放其他变量地址的指针变量。同时,需要声明变量的类型,以便能通过指针正确访问特定类型的数据。定义指针变量的一般形式为:类型标识符 *指针变量名;例如:int *p1;/定义p1为指向整型变量的指针变量char *p2;/定义p2为指向字符型变量的指针变量15第8章 指针、结构体与共用体在定义指针变量时需要注意以下几方
6、面:(1)在指针变量定义中,“*”是一个说明符,它表明其后的变量是指针变量。(2)指针变量定义时指定的数据类型不是指针变量本身的数据类型,而是指针变量所指向的对象的数据类型,指针变量本身没有数据类型。(3)指针变量存放的是所指向的某个变量的地址值。(4)指针变量并不固定指向一个变量,可指向同类型的不同变量。16第8章 指针、结构体与共用体若有定义“int a,*pa;”,该语句仅仅定义了指针变量pa,但指针变量并未指向任何确定的变量。因为这些指针变量还没有被赋予确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量。可以在定义指针变量的同时进行初始化。例如:int a
7、,*pa = &a;要注意,当要声明多个指针变量时,必须在每个指针变量名前加上“*”,例如:int *iptr1,*iptr2,iptr3; /iptr1和iptr2是指向整型变量的指针变量,而iptr3是整型变量17第8章 指针、结构体与共用体8.2.3 指针的基本操作1指针变量的赋值指针变量在使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱甚至死机。可以用赋值表达式语句给指针赋值,也可以在定义指针的同时给它赋值。例如:int x,*p = &x;这是给指向int型变量的指针P赋初值,即将int型变量x的地址值赋给p。也可以写成赋值表达式的形式,如
8、下所示:int x,*p;p = &x;18第8章 指针、结构体与共用体使用指针进行赋值运算时要注意以下几种情况:(1)给指针变量赋值时,指针变量前不能加“*”说明符。下面的写法是错误的:int i;int *p;*p = &i; /错误,指针变量p前面加“*”表示间接访问19第8章 指针、结构体与共用体(2)指针变量未指向具体有效地址,间接访问会有问题。例如:int *p;/指针变量p未赋值,指向不明确*p = 100;/向p指向的地址空间赋值100(3)不能用一个数给指针变量赋值。下面的赋值是错误的:int *pi;pi = 10;但是,可以用0给指针赋值,也可用符号常量NULL表示,代表
9、空指针,不指向任何内存单元。20第8章 指针、结构体与共用体(4)指针变量的值是可以改变的。例如:int i1 = 3,i2 = 4,*pi; /定义指针变量 pipi = &i1;/变量 pi 指向 i1pi = &i2;/改变指针变量pi的指向,使其指向i2上例中,pi开始指向整型变量i1,接着改变pi的指向。指针变量pi的指向变化如图8-3和图8-4所示。图8-4 指针变量pi变化后的指向图8-3 指针变量pi的初始指向 21第8章 指针、结构体与共用体(5)指针变量只能用同类型的地址赋值。例如:float *p; /p是指向浮点类型变量的指针变量char c;/宇符变量p = &c;p
10、只能存储float型数据的地址,用字符型数据地址赋值是错误的。22第8章 指针、结构体与共用体【例8-2】通过交换指针变量改变变量的值。任务分析:定义两个指针,分别指向两个变量,然后交换指针变量,最后用printf()函数通过指针变量输出变量的值。程序分析:程序开始定义了两个整型变量i1、i2,又定义了指向整型变量的指针pi1、pi2、pi3。指针变量pi1、Pi2、pi3分别指向i1、i2和空,然后交换指针变量pi1、pi2和pi3。23第8章 指针、结构体与共用体程序代码:打开链接24第8章 指针、结构体与共用体2指针运算符1)取地址运算符(&)作用:用于变量名之前,表示变量的存储地址。其
11、操作数可以是各种类型的简单变量、数组元素、结构成员,不能用于表达式、常量和寄存器变量,是描述变量地址的工具。例如:int x;scanf(%d,&x);上例中,&x给出变量x的存储单元的地址,作为存放输入数据的指针,将数据存入变量x的存储单元中。2)指针运算符(*)。作用:定义指针变量;通过指针实现“间接访问”存储单元的数据。25第8章 指针、结构体与共用体【例8-3】通过指针实现“间接访问”存储单元的数据。任务分析:声明指针变量,然后对指针变量赋值,最后通过printf()函数在屏幕输出变量的值。程序代码如下:程序分析:程序中j=*pi是将指针pi所指的存储单元的内容赋给变量j,实际上是对变
12、量i的间接存取。*pi意为指针变量pi所指的变量,相当于变量i的值。26第8章 指针、结构体与共用体程序代码:打开链接27第8章 指针、结构体与共用体3)&和*运算符&和*两个运算符的优先级是相同的,结合规律是右结合性。例如,若“pi = &i;”,则&*pi等价于&i,等价于i,(*pi)+等价于i+。4)算术运算符+、-、+;、-+:地址表达式(pi) + 整型表达式(in),结果为pi当前所指的地址向地址大的方向移动inpi所指类型占用的内存字节数个字节后的地址。-:地址表达式(pi) - 整型表达式(in),结果为pi当前所指的地址向地址小的方向移动inpi所指类型占用的内存字节数个字
13、节后的地址。28第8章 指针、结构体与共用体+:地址变量(pi)+或者+地址变量(pi),结果为pi当前所指的地址向地址大的方向移动一个字节后的地址。-:地址变量(pi)-或者-地址变量(pi),结果为在pi当前所指的地址向地址小的方向移动一个字节后的地址。29第8章 指针、结构体与共用体【例8-4】通过指针算术运算符的计算,在屏幕上输出运算后的结果。任务分析:首先定义几个指针变量指向数组元素,然后调用+、-、+、-等运算符进行指针运算,最后通过printf()函数输出指针指向的变量的值。30第8章 指针、结构体与共用体程序代码:打开链接31第8章 指针、结构体与共用体程序分析:*pi+:由于
14、+和*的优先级相同,结合方向为自右而左,等价于*(pi+)。先取*pi,然后将pi加1。表达式的值为arr1,pi的值为&arr2。*+pi:等价于*(+pi)。先将pi加1,然后取*pi。表达式的值为arr2,pi的值为&arr2。(*pi)+:先取*pi,然后将*pi加1。表达式的值为arr1+,arr1的值改变了;pi的值为&arr1,pi的值未改变。pi2 - pi1:pi2和pi1相差两个整型数所占字节数的大小,它的返回值不是相差的字节数,而是相差整数的个数,所以值为2。32第8章 指针、结构体与共用体8.2.4 指针和数组指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第8章 指针、结构体与共用体1 指针 结构 共用
限制150内