软件技术基础之指针和结构体.ppt_第1页
软件技术基础之指针和结构体.ppt_第2页
软件技术基础之指针和结构体.ppt_第3页
软件技术基础之指针和结构体.ppt_第4页
软件技术基础之指针和结构体.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指针,1、内存:由存储单元组成。其特点为存储单元是线性连续的。存储单元的最小单位是 字节。,2、内存地址:正如我们的住房都有门牌号码一样,为了访问内存中的某个存储单元,我们也要为它编号,这种编号称为内存地址。利用内存地址我们可以访问该地址标识的存储单元。,一、指针的相关基本概念:,Byte,3、程序中一旦定义了一个变量,该变量在内存中就将占用一定的存储单元。变量占用的存储单元总是n(n0)个连续的字节,开始字节的地址,就是变量的地址也可称为该存储单元的首地址。,二、指针的基本概念:,指针就是变量的地址。与此对应,在C语言中使用一类专门的变量即指针变量来存放变量的地址。因此,指针变量是存放地址数据的变量。,从右图可知,指针变量和一般变量一样,仅仅是变量的内容为变量地址的变量而已。,指针变量pi,变量i,变量值,变量地址(指针),变量地址存入指针变量,指向,这里变量和指针变量的类型必须一致。,一般而言,指针变量只能存放某一种数据类型的变量的地址,由此可将指针变量分为:整型指针变量、实型指针变量和字符型指针变量等等,指针变量的类型表明了其指向的存储单元中存放的数据的类型。,当把变量的地址存入指针变量后,我们就认为 这个指针指向了该变量。,指针的定义方式如下: 数据类型名 * 指针变量名;,在定义指针时要注意以下几个问题:,int *prt1,*ptr2;,三、指针变量的定义:, 变量前面的“*”不能省略,如果写成:,则表示 ptr2 被定义为整型变量而非整型指针变量。,int *prt1,ptr2;, 定义中的“*”表示所定义的变量是指针变量,但 指针变量名为ptr1、ptr2而非 * ptr1、* ptr2。, 指针变量只能指向定义时所规定类型的变量。如 ptr1、ptr2只能指向整型变量而不能指向实型或 字符型变量。, 定义指针变量后,并未确定该变量指向何处。即是 说该变量的值是不确定的,在引用该指针变量前, 必须先让它指向一个变量或在内存中为其分配一个 相应的存储单元。,四、指针的“&”、“*”和赋值运算:,取地址运算符&的作用是取变量的地址。如:& i 表示求变量 i 的地址。,引用运算符 * 的作用是取指针指向变量的内容。如: * ptr 表示求指针 ptr 所指向变量的内容。,1 、& 取地址运算和 * 引用运算,& 运算和 * 运算是一对逆运算。,先对变量 i 作取地址运算,其地址值赋给 point,point指针就已指向变量 i, *point的值为3。给*point 赋值相当于给 i 赋值。,main( ) int i=3; int *point; point= ,2、指针的赋值运算,指针的赋值运算可以是以下两种方式:把地址的值赋给指针变量;把一个指针的值赋给另一个指针。,注意: 指针的值为空时,C语言中常用一符号常量 NULL给其赋值。,main( ) int i=3,ary5; int *ptr1,*ptr2; ptr1= ,main( ) float flt; float *f_ptr= . ,例下面我们来看一个和“&”“*”和指针赋值语句相关的例子,数组在内存中占用连续的存储单元。指针最常见的一种用途就是指向数组元素。当一个指针指向数组元素后,就可以用它灵活、快速地处理数组元素,从而体现出指针的优势。,main( ) int *ptr1,*ptr2.*ptr3; int ary5=2,4,8,16,32; ptr1= ,五、指针和数组:,(一)、指针和一维数组,C语言中规定数组名代表数组的首地址,即第一个元素的地址。因此ptr3 = ary 等价于 ptr3 = &ary0;当指针指向数组的首地址时,指针可以象数组一样使用。若指针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); ,但是,指针变量与数组名有区别:指针变量是地址变量,数组名是地址常量。即是说指针变量的内容可以在程序运行的过程中被改变,而数组名一旦被初始化,它的值就不能被改变了。,main( ) int *ptr,i,ary10; ptr=*i; ary= ,例要求先打印一个数组中的各元素,然后逆序再打印一遍。,(二)、指针的加减运算:,、指针与整型值的加减的结果是使该指针下移或上移整型值所指定个数的存储单元后的地址。存储单元的大小就是该指针的数据类型所需的内存大小。,、指针之间不允许加运算。,、指针之间的减运算的含义是计算这两个指针相差几个存储单元,其结果是一个整数,可由下式计算:,ptr1-ptr2=(ptr1的值-ptr2的值)/sizeof(指针的类型),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-=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、赋值的方法不同:,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=%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、函数指针:是指向一个函数在编译时被分配的一个函数的入口地址。可以通过一个函数指针来访问该函数。,函数指针定义的一般形式:,数据类型 (* 指针变量名)();,返回值,指针变量是专门用于存放函数入口地址的。,给指针变量赋值时,只需给出函数名。,用指针变量调用函数时,只需用(* p)代替函 数名即可。,对指向函数的指针变量不存在p+n,p+,p 等运算。,int max(int x,int y); main( ) int n1,n2,a; scanf(“%d,%d”, ,main( ) int max(int x,int y); int n1,n2,a; int (* p)( ); p=max; scanf(“%d,%d”, ,指针的使用在给编程提供了一个强有力工具,但使用不当却又可能带来编程中最难对付的问题。指针操作不当,可能读写一些未知的内存单元,严重的是写操作时,就有可能将数据写入一些重要的内存单元,导致程序或系统受到破坏。 因此使用指针的正确方法是:使用前必须弄清该指针指向那里。,指 针 小 结,指针是C语言中的一个重要概念,是C语言的特色。指针就是地址,指针除了有“&”、“*”两个单目运算符之外,还可进行加减和自加减等运算。使用指针可:在函数调用的过程中灵活地修改函数中的被调参量(实参);可提高某些程序的效率;指针可用来实现内存空间的动态分配。,在学习结构之前,我们来考虑这样一个问题,假定要统计某系同学的基本情况,包括每个学生的姓名、年龄、身高、体重和各科成绩等。可以为每个学生的各项数据分别定义 一个变量,诸如:name、sex、age、sore5等,但是这样之后各项数据之间的紧密联系在程序形式是就无法体现出来了。如当我们知道了某个学生的姓名,要查询出他的年龄性别等就显得很不方便。,实际上,C语言允许我们把一组逻辑是相关联的数据组织起来,作为一个整体使用。这就是结构体的概念。,结构是一组可以整体引用的变量。它与数组的区别在于结构的元素(称为结构成员)不必是相同的数据类型,并且结构成员可以分别加以引用,利用结构可以组织起复杂紧凑的数据结构。在程序中使用结构,首先要定义结构类型;然后在定义结构变量。结构类型定义描述结构成员的名称和它们的数据类型。结构变量定义则根据结构类型为所定义的变量分配存储单元。,结构体,一、结构类型的定义,结构类型定义的一般形式:,结构类型定义的一般形式:,struct 结构名 数据类型名 结构成员1; 数据类型名 结构成员2; 数据类型名 结构成员n; ;,struct data int year; int month;; int day; ;,二、结构变量的定义,struct 结构名 结构变量列表;,例如:struct date today,tomorrow;,结构的定义和结构变量的定义可以结合进行:,struct data 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、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) /*正确*/,另一种引用的形式: 结构指针变量名 成员名 定义:struct data * today; today 为指向该结构的指针,printf(“%d”,today.year); /* 打印today的结构成员year */ today.month=12; /* 为today的成员month赋值为12 */,printf(“%d”,todayyear); /* 打印today

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论