软件技术基础之指针和结构体课件ppt课件.ppt

上传人:本田雅阁 文档编号:2602048 上传时间:2019-04-16 格式:PPT 页数:23 大小:316.01KB
返回 下载 相关 举报
软件技术基础之指针和结构体课件ppt课件.ppt_第1页
第1页 / 共23页
软件技术基础之指针和结构体课件ppt课件.ppt_第2页
第2页 / 共23页
软件技术基础之指针和结构体课件ppt课件.ppt_第3页
第3页 / 共23页
软件技术基础之指针和结构体课件ppt课件.ppt_第4页
第4页 / 共23页
软件技术基础之指针和结构体课件ppt课件.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《软件技术基础之指针和结构体课件ppt课件.ppt》由会员分享,可在线阅读,更多相关《软件技术基础之指针和结构体课件ppt课件.ppt(23页珍藏版)》请在三一文库上搜索。

1、C语言回顾 指针,1、内存:由存储单元组成。其特点为存储单元是线性连续的。存储单元的最小单位是 字节。,2、内存地址:正如我们的住房都有门牌号码一样,为了访问内存中的某个存储单元,我们也要为它编号,这种编号称为内存地址。利用内存地址我们可以访问该地址标识的存储单元。,一、指针的相关基本概念:,Byte,3、程序中一旦定义了一个变量,该变量在内存中就将占用一定的存储单元。变量占用的存储单元总是n(n0)个连续的字节,开始字节的地址,就是变量的地址也可称为该存储单元的首地址。,二、指针的基本概念:,指针就是变量的地址。与此对应,在C语言中使用一类专门的变量即指针变量来存放变量的地址。因此,指针变量

2、是存放地址数据的变量。,从右图可知,指针变量和一般变量一样,仅仅是变量的内容为变量地址的变量而已。,指针变量pi,变量i,变量值,变量地址(指针),变量地址存入指针变量,指向,这里变量和指针变量的类型必须一致。,一般而言,指针变量只能存放某一种数据类型的变量的地址,由此可将指针变量分为:整型指针变量、实型指针变量和字符型指针变量等等,指针变量的类型表明了其指向的存储单元中存放的数据的类型。,当把变量的地址存入指针变量后,我们就认为 这个指针指向了该变量。,指针的定义方式如下: 数据类型名 * 指针变量名;,在定义指针时要注意以下几个问题:,int *prt1,*ptr2;,三、指针变量的定义:

3、, 变量前面的“*”不能省略,如果写成:,则表示 ptr2 被定义为整型变量而非整型指针变量。,int *prt1,ptr2;, 定义中的“*”表示所定义的变量是指针变量,但 指针变量名为ptr1、ptr2而非 * ptr1、* ptr2。, 指针变量只能指向定义时所规定类型的变量。如 ptr1、ptr2只能指向整型变量而不能指向实型或 字符型变量。, 定义指针变量后,并未确定该变量指向何处。即是 说该变量的值是不确定的,在引用该指针变量前, 必须先让它指向一个变量或在内存中为其分配一个 相应的存储单元。,四、指针的“&”、“*”和赋值运算:,取地址运算符&的作用是取变量的地址。如:& i 表

4、示求变量 i 的地址。,引用运算符 * 的作用是取指针指向变量的内容。如: * ptr 表示求指针 ptr 所指向变量的内容。,1 、& 取地址运算和 * 引用运算,& 运算和 * 运算是一对逆运算。,先对变量 i 作取地址运算,其地址值赋给 point,point指针就已指向变量 i, *point的值为3。给*point 赋值相当于给 i 赋值。,main( ) int i=3; int *point; point= ,2、指针的赋值运算,指针的赋值运算可以是以下两种方式:把地址的值赋给指针变量;把一个指针的值赋给另一个指针。,注意: 指针的值为空时,C语言中常用一符号常量 NULL给其赋

5、值。,main( ) float flt; float *f_ptr= . ,下面我们来看一个和“&”“*”和指针赋值语句相关的例子,数组在内存中占用连续的存储单元。指针最常见的一种用途就是指向数组元素。当一个指针指向数组元素后,就可以用它灵活、快速地处理数组元素,从而体现出指针的优势。,main( ) int *ptr1,*ptr2.*ptr3; int ary5=2,4,8,16,32; ptr1= ,五、指针和数组:,(一)、指针和一维数组,C语言中规定数组名代表数组的首地址,即第一个元素的地址。因此ptr3 = ary 等价于 ptr3 = &ary0;当指针指向数组的首地址时,指针可

6、以象数组一样使用。若指针ptr指向了数组ary的首地址,就有:*(ptr+2)、ptr2、ary2、*(ary+2)这四种形式都表示了数组的第三个元素。,运行结果: *(ptr+2)=5 ptr2=5 ary2=5 *(ary+2)=5,#include main( ) int *ptr; int ary5=2,9,5,45,3; ptr=ary; printf(“*(ptr+2)=%dn”,*(ptr+2); printf(“ptr2)=%dn”,ptr2); printf(“ary2)=%dn”,ary2); printf(“*(ary+2)=%dn”,*(ary+2); ,但是,指针变量

7、与数组名有区别:指针变量是地址变量,数组名是地址常量。即是说指针变量的内容可以在程序运行的过程中被改变,而数组名一旦被初始化,它的值就不能被改变了。,main( ) int *ptr,i,ary10; ptr= ,例要求先打印一个数组中的各元素,然后逆序再打印一遍。,(二)、指针的加减运算:,、指针与整型值的加减的结果是使该指针下移或上移整型值所指定个数的存储单元后的地址。存储单元的大小就是该指针的数据类型所需的内存大小。,、指针之间不允许加运算。,、指针之间的减运算的含义是计算这两个指针相差几个存储单元,其结果是一个整数,可由下式计算:,ptr1-ptr2=(ptr1的值-ptr2的值)/s

8、izeof(指针的类型),1、指针的加减运算(+、-):指针的加减运算有两种形式一是指针与整型值的加减运算;另一种是指针与指针的减运算。,main( ) int *ptr1,*ptr2,x; int ary5=2,4,6,8,10; ptr1=ary; ptr2=ptr1+3; x=ptr2-ptr1; ,2、指针的自加减运算(+、-、+=、- =): + + 和 += 运算是将指针下移一个或几个存储单元; - - 和 - = 运算是将指针上移一个或几个存储单元。,main( ) int *ptr; int ary5=2,4,6,8,10; ptr=ary; ptr+=3; ptr-; ptr

9、-=2; ptr+; ,(四)、字符指针与字符串:,main( ) char string=“Hell0”; printf(“%sn”,string); ,main( ) char *string=“Hell0”; printf(“%sn”,string); ,string,str,string,例:将字符串A复制为字符串B。,字符数组和字符指针的使用区别:,1、两者中存放的内容不同;,string,string,str,str,H,e,l,l,o,0,char string10; string = “Hell0!”;,char *string; string = “Hell0!”;,2、赋值

10、的方法不同:,3、指针变量的值是可以改变的,而数组名是常量。,1、指针可以作为函数的参数,这同用数组名作为参数的用法一致:可传递大量数据;可改变参数的值。,六、指针和函数,例:用一个函数来实现交换两个数据。,#include void swap(int *p1,int *p2); main() int x1,x2; x1=100;x2=200; printf(”x1_old=%d,x2_old=%d“,a,b); swap( ,#include void swap(int p1,int p2); main() int x1,x2; x1=100;x2=200; printf(”x1_old=%

11、d,x2_old=%d“,a,b); swap(x1,x2); printf(”x1_new=%d,x2_new=%d“,a,b); void swap(int p1,int p2) int temp; temp=p1; p1=p2; p2=temp; ,2、返回指针值的函数,类型名 *函数名(形参表) 函数体 return 地址值; ,int *arr3(int a34) int b3,i,j; for(i=0;i3;i+) bi=ai0; for(j=0;j4;j+) if(biaij) bi=aij; return b; ,1)定义形式,2)调用形式,int *p,x34; p=arr3

12、(x);,该函数求二维数组中每行的最大数,指针的使用在给编程提供了一个强有力工具,但使用不当却又可能带来编程中最难对付的问题。指针操作不当,可能读写一些未知的内存单元,严重的是写操作时,就有可能将数据写入一些重要的内存单元,导致程序或系统受到破坏。因此使用指针的正确方法是:使用前必须弄清该指针指向那里。,习题:10.1、10.3、10.6、10.8、10.10、10.16,指 针 小 结,指针是C语言中的一个重要数据类型,是C语言的特色。指针变量就是存放地址的变量,指针除了有“&”、“*”两个单目运算符之外,还可进行加减和自加减等运算。使用指针可:在函数调用的过程中灵活地修改函数中的被调参量(

13、实参);可提高某些程序的效率;指针可用来实现内存空间的动态分配。,假定要统计某系同学的基本情况,包括每个学生的姓名、年龄、身高、体重和各科成绩等。可以为每个学生的各项数据分别定义 一个变量,诸如:name、sex、age、sore5等,但是这样之后各项数据之间的紧密联系在程序形式是就无法体现出来了。如当我们知道了某个学生的姓名,要查询出他的年龄性别等就显得很不方便。,C语言允许我们把一组逻辑是相关联的数据组织起来,作为一个整体使用。这就是结构体的概念。,结构是一组可以整体引用的变量。它与数组的区别在于结构的元素(称为结构成员)不必是相同的数据类型,并且结构成员可以分别加以引用,利用结构可以组织

14、起复杂紧凑的数据结构。在程序中使用结构,首先要定义结构类型;然后在定义结构变量。结构类型定义描述结构成员的名称和它们的数据类型。结构变量定义则根据结构类型为所定义的变量分配存储单元。,C语言回顾 结构体,一、结构类型的定义,结构类型定义的一般形式:,结构类型定义的一般形式:,struct 结构名 数据类型名 结构成员1; 数据类型名 结构成员2; 数据类型名 结构成员n; ;,struct date int year; int month;; int day; ;,二、结构变量的定义,struct 结构名 结构变量列表;,例如:struct date today,tomorrow;,结构的定义

15、和结构变量的定义可以结合进行:,struct date int year; int month;; int day; today,tomorrow;,struct 结构名 结构变量名=成员1的值,成员2的值,;,例如:struct date nextday=2001,11,10;,三、结构变量的初始化,struct 结构名 数据类型名 结构成员1; 数据类型名 结构成员2; 数据类型名 结构成员n; 结构变量名列表;,四、结构的引用,引用的形式: 结构变量名. 成员名,对结构变量today而言,有效的结构成员为year、month、day。那么today. year 、today. month

16、、today. day就是对其各个成员的引用。,C语言允许将一个结构变量作为一个整体赋值给另一个同一类型的结构变量。,C语言不允许将两个结构变量整体比较,只能逐个成员的进行比较。,Struct date day1= 2000,10,24; struct date day2; day2=day1; /* 将的day1各成员的值赋给day2 */,if(day1=day2) /* 错误 */,if( day1.year=day2.year & day1.month=day2.month & day1,day=day2.day) /*正确*/,另一种引用的形式: 结构指针变量名 成员名 定义:str

17、uct data * today; today 为指向该结构的指针,printf(“%d”,today.year); /* 打印today的结构成员year */ today.month=12; /* 为today的成员month赋值为12 */,printf(“%d”,todayyear); /* 打印today指向结构的成员year */ today month=12; /* 为today指向的结构的成员month赋 值为12 */,例:结构例程。,可见,“”和“”操作符分别使用在用指向结构的指针和用结构变量来访问结构中的数据项(成员)时。,结 构 体 小 结,结构体是C语言中的一种复杂(构造)类型,它是一种被命名为一个标识符的各种变量的集合。结构的定义确定了结构变量或结构指针的格式,结构是软件设计中实现数据抽象的基础。,本章要求掌握 结构定义的基本概念和方法,结构变量和结构指针的含义以及利用结构变量或结构指针来引用结构成员的基本方法。,习题:11.3、11.4,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1