




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章指针、函数、及其他数据类型,指针函数结构体共用体枚举,3.1指针,指针是一种非常重要的数据类型,利用指针变量可以表示各种数据结构,方便地引用数组和字符串,像汇编语言一样处理内存地址。指针极大地丰富了语言的功能,运用指针编程是语言最主要的风格之一。,3.1.1指针的基本概念,指针变量的定义数据类型符*指针变量名;int*p;double*pd;int*p1,*p2;int*p1,p2;,3.1.1指针的基本概念,3.1.1指针的基本概念,指针的运算指针是一个内存地址值,它是一个无符号的整数,可以进行加法和减法运算,但不允许进行乘法、除法和两个指针值的相加运算。指针类型的变量在内存中都和int类型所占的大小想相同,可以使用sizeof来查看大小inta5=1,2,3,4,5;int*p1=,3.1.1指针的基本概念,void指针类型void*p;上面的定义中,p仍然是一个指针变量,有自己的内存空间,占用4个字节,但是没有指定它指向哪种类型的变量。在这种情况下,不能对指针变量进行运算,否则会导致编译错误。,3.1.1指针的基本概念,指针的类型转换(TYPE*)p强制类型转换的结果是生成一个新的指针,该指针的类型为TYPE*,所指向的类型为TYPE,其他属性都不变,所指向的地址仍为原来的地址。,3.1.1指针的基本概念,指向指针的指针数据类型符*指向指针的指针变量名;inta,b;int*p;int*pp;p=问上面的语局同什么语句相同?*pp=int*p;p=a;p=对数组元素的引用既可以使用下标法,也可以使用指针的表示方法,如:p+n与a+n表示数组元素an的地址,即,3.2函数,函数的定义与声明函数的调用与参数传递变量的作用域变量的存储类型外部函数和内部函数函数的递归函数指针,3.2.1函数的定义与声明,函数对应于程序的模块,需要先定义后使用。定义也叫函数的声明,函数的声明需要注意的是函数句尾有一个分号,并且形式参数可以只写数据类型返回值类型符函数名(形式参数列表)定义部分;执行语句部分;return语句的格式为:return表达式;return(表达式);,3.2.2函数的调用与参数传递,函数调用的一般格式为:函数名(实际参数列表)函数参数传递是调用函数和被调用函数在调用发生时进行通信的方法。基本的参数传递机制有:值传递:被调用函数中的任何操作都不会影响到实参变量的值地址传递:被调用函数队形式参数的任何擦操作做都被处理成间接寻址,通过对地质访问,会影响实际参数变量通过指针的方式实现了地质的传递,但这种地质传递方式实际上也是值传递,只不过传递的是地址值,3.2.3变量的作用域,局部变量是在函数内部定义的变量或函数的形式参数。intfunc(inta,intb)inti;intmain()inti,j;,3.2.3变量的作用域,全局变量是在函数外部定义的变量intx,y;voidfunc()intmain()/*inty;*/现在全局变量x,y在两个函数中都可以使用,需要注意的是,如果在函数内部定义变量和全局变量名相同,又或者是函数参数中有和全局变量名相同,则会使用局部变量.,3.2.3变量的作用域,如果需要在未定义前使用全局变量,声明全局变量:extern数据类型符全局变量名;使用全局变量可以减少函数调用过程中实际参数和形式参数之间数据传递带来的时间消耗。但也会带来了一些问题全局变量破坏了函数的封装性全局变量使函数代码的可读性降,3.2.4变量的存储类型,定义一个变量的完整形式应为:存储类型说明符数据类型符变量名;存储类型说明符有四种:auto(自动变量)extern(外部变量)static(静态变量)register(寄存器变量),变量的存储类型,变量在内存中的存储方式可以分为两种,静态存储和动态存储静态存储:变量在定义的时候就分配存储单元并一直保持到整个程序的结束全局变量即属于静态存储的方式动态存储:在程序执行过程中,使用它时才分配存储单元,使用完立即释放.函数的形式参数,在定义的时候不会分配内存空间,只要被调用的时候,才进行内存的分配,如果一个函数被反复调用,则会反复地进行存储单元的分配与释放通常把由于变量的存储方式不同而产生的特性成为变量的生存期,生存期表示了变量存在的时间,也叫生命周期.生命周期和作用域是从时间和空间两个不同的角度来描述变量的特性C语言中存储类型分为四种,变量的存储类型,一自动变量默认的情况下,所有的局部变量都是自动变量autointainta是相同的关键字可以省略二外部变量全局变量的存储方式,都是外部变量,使用extern关键字声明,全局是从作用域角度说的,外部是从存储方式说的.所谓的外部就是,该类型的变量可以在所有构成程序的源文件中使用三静态变量static关键声明,重要的是,他对于修饰局部变量和全局变量含义是不一样的externinta全局变量,可以在多个源文件中使用staticexterninta也是全局变量,但是只是本文件的全局变量,不能再其它文件中使用,静态全局变量static修饰局部变量,特点是,该变量位于静态存储区,在整个程序运行期间始终占用着被分配的空间.也就是说,在函数调用后,他的值依然存在,并可能会影响下一次函数的调用四寄存器变量变量一般是存放在内存中的,但是对于一些频繁使用的变量,为了提高存取时间,可将其放入在CPU的寄存器中.叫寄存器变量.registerinti.一般来说没必要这么声明,编辑器会优化变量的声明,并自动识别,转换成寄存器变量,3.2.5外部函数和内部函数,当一个程序由多个源文件组成时,可以指定一个文件中的函数能被其他文件调用,也可以指定该函数只能被本文件使用。从这个意义上讲,函数可以分为:外部函数:默认就是外部函数extern关键字内部函数:static关键字来声明,3.2.5外部函数和内部函数,如果一个函数可以被其他源文件调用,该函数就称为外部函数。定义外部函数时,在函数前面加关键字extern。externintadd(inta,intb)returna+b;,3.2.5外部函数和内部函数,如果一个函数只能被本文件中的其他函数调用,该函数就称为内部函数。定义内部函数时,在函数前面加关键字static。staticintadd(inta,intb)returna+b;,3.2.6函数的递归,所谓递归,就是函数自己调用自己,或在自己调用的下一级函数中调用自己。函数的递归之所以能实现,就是因为函数在每次调用时都在栈中有形参和局部变量的拷贝,他们与函数的其他调用过程无关。采用递归的方法解决实际问题时,必须满足一定的条件:可以把要解决的问题转化为一个新的问题,而新问题的解决方法与原问题相同,只是所处理的对象有规律地递增或递减;要有递归结束的条件,即在适当的地方结束递归调用,否则将进入死循环。,3.2.7函数指针,函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针变量的定义格式为:函数的返回值类型(*函数指针变量名)(函数的形式参数)void(*p)(intx);intfunc(intx);/*声明一个函数*/int(*f)(intx);/*声明一个函数指针*/定义一个指针变量f,它指向某一个函数,这种函数返回值类型是int,并且参数类型是int类型,这里只是定义,并未赋值f=func;/*将func函数的首地址赋给指针f*/赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。(*f)(9)通过函数指针调用了func,函数指针,函数指针也可以作为函数的参数使用tpyedef关键字typedef类型别名例typedefintint32;int32a=9;上面的int32就变成了一种类型,它指代的是int类型typedefvoid(*pt)(int,int)上面的含义是定义一个函数指针类型ptvoidadd(int,int);voidsub(int,int);voidfun(pt,int,int);定义一个函数,其中一个参数是指针类型pt,3.3结构体、共用体和枚举,前面介绍的数据类型(如字符型、整型、数组和指针等)只能描述事物某一方面的属性。而现实世界中的事物往往具有多方面的属性,为此C语言提供几种用户可以自定义的数据类型:结构体、共用体和枚举。,3.3.1结构体,结构类型体的定义struct结构体名数据类型符成员1;数据类型符成员2;数据类型符成员n;,3.3.1结构体,结构体变量的定义先定义结构体,然后像定义基本数据类型变量一样,定义结构体类型的变量在定义结构体的同时定义结构体变量,适用于定义局部使用的结构体变量直接定义结构体变量,即在定义结构体的同时定义结构体变量,但不给出结构体名,3.3.1结构体,结构体变量的初始化struct结构体名结构体变量名=初始数据表;structstudenta=23,ZhangXing,M,28,1002XinJianRoad;,3.3.1结构体,指向结构体的指针struct结构体名*结构体指针名structstudent*p;,3.3.1结构体,结构体变量成员的引用结构体变量名.成员名a.id(*结构体指针变量).成员名(*p).id结构体指针变量-成员名p-id,3.3.1结构体,嵌套结构体structstudentintid;charname20;charsex;unsignedintage;structaddraddress;结构体变量名.嵌套结构体变量名.结构体成员名student.address.zipcode,structaddresscharcity32;charaddress100;unsignedlongzipcode;chartel8;,3.3.1结构体,应用实例,3.3.2共用体,共用体又称为联合体,它也是由不同类型的数据构成的。共用体和结构体的主要区别是:共用体存储时采用了覆盖技术,不同数据类型的成员占用同一段内存空间。这样在某一时间点上,共用体中只能存储其某一成员的信息。,3.3.2共用体,共用体类型的定义union共用体名数据类型符成员1;数据类型符成员2;数据类型符成员n;共用体变量的定义union共用体名共用体变量名;,3.3.3枚举,枚举是一个被命名的整
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑专业试题及答案
- 遥感专业面试题目及答案
- 文职专业课试题及答案
- 航运专业笔试题及答案
- 金融专业硕士试题及答案
- 湖南省三湘名卷2025年中考历史教学最后一卷(含答案)
- 浅滩风电施工方案
- 片石拱顶施工方案
- 内江餐厅格栅施工方案
- 2025年山东省枣庄市滕州市荆河街道滕南中学中考数学模拟试卷(六)(含答案)
- 创新联合体建设管理办法
- 2025至2030中国组网专线行业市场发展现状及发展趋势与投资前景预测报告
- 新解读《城镇供水管网运行安全风险评估规范 T-CAS 737-2023》
- 苏教版五年级数学上册全册单元检测题(及参考答案)
- 职业妆容设计课件
- 桡骨远端骨折健康宣教
- 2024年急性ST段抬高型心肌梗死诊断和治疗指南
- GB/T 5974-2025起重机械钢丝绳用套环
- 无人机激光雷达扫描技术应用
- 物资验收培训课件
- 臭氧治疗学讲课件
评论
0/150
提交评论