版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、指针与动态内存分配1-2课程内容安排课程内容安排指针概述指针概述 指针的运算指针的运算 指针与数组指针与数组 指针与函数指针与函数 指针与字符串指针与字符串 二级指针二级指针 动态内存分配动态内存分配小结小结 习题习题 1-31 1 指针概述指针概述 1.1.内存单元:在计算机中,一切的数据都是存放在存储器中的。普内存单元:在计算机中,一切的数据都是存放在存储器中的。普通把存储器中的一个字节称为一个内存单元,不同的数据类型所占通把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占用的内存单元数不等,如整型量占2 2个单元,字符量占个单元,字符量占1 1个单元等
2、。个单元等。为了正确地访问内存单元,必需为每个内存单元编上号。根据一个为了正确地访问内存单元,必需为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。做地址。简单来说,指针是一个地址,其指向存储某一个数据的存储地址。简单来说,指针是一个地址,其指向存储某一个数据的存储地址。指针变量是一种特殊性质的变量。指针变量是存放另一个变量的地指针变量是一种特殊性质的变量。指针变量是存放另一个变量的地址的变量。它和普通变量一样占用一定的存储空间。它与普通变量址的变量。它和普通变量一样占用一定的存储空间。它与
3、普通变量不同之处:指针的存储空间里存放的不是普通的数据,而是一个地不同之处:指针的存储空间里存放的不是普通的数据,而是一个地址。址。对于指针我们可以这样了解,比如一个人要到某地去,但不认识路,对于指针我们可以这样了解,比如一个人要到某地去,但不认识路,于是去问交警。然后交警把该地方的地址写在了一张纸上,并且给于是去问交警。然后交警把该地方的地址写在了一张纸上,并且给了该问路人。那么交警写的地址就是指针,指向要去的地址,而那了该问路人。那么交警写的地址就是指针,指向要去的地址,而那张纸就是指针变量,用于存储指针。张纸就是指针变量,用于存储指针。 1-42 2 定义指针定义指针 指针是一个变量,在
4、程序中运用时,必需先声明,后运指针是一个变量,在程序中运用时,必需先声明,后运用。在指针声明的同时也可以进展初始化。指针的定义用。在指针声明的同时也可以进展初始化。指针的定义指出了指针的存储类型和数据类型,定义的语法方式如指出了指针的存储类型和数据类型,定义的语法方式如下:下:存储类型名存储类型名 数据类型数据类型 *指针变量名指针变量名例如:例如:int *px;char *name;static int *pa;定义了一个指针后,在运用此指针前,必需首先给它赋定义了一个指针后,在运用此指针前,必需首先给它赋一个合法的值。否那么,程序中对指针的运用就有能够一个合法的值。否那么,程序中对指针的
5、运用就有能够导致系统解体。可以在定义指针的同时经过初始化来给导致系统解体。可以在定义指针的同时经过初始化来给指针赋值,也可以在运用之前给指针赋值。指针初始化指针赋值,也可以在运用之前给指针赋值。指针初始化的普通方式如下:的普通方式如下:存储类型存储类型 数据类型数据类型 *指针名指针名=初始地址值初始地址值;1-53 3 指针的运算指针的运算 两个有关的运算符:两个有关的运算符:1&:取地址运算符:取地址运算符2*:指针运算符或称:指针运算符或称“间接访问运算符间接访问运算符 例如,例如,&为变量的地址,为变量的地址,*为指针变量所指向的变为指针变量所指向的变量量 运用运用*p
6、与定义与定义*p不同,定义时,不同,定义时,int *p中的中的“*不是运算符,不是运算符,而在程序执行语句中,援用而在程序执行语句中,援用“*p,其中的,其中的“*是一个指针运算是一个指针运算符符指针运算是以指针变量所持有的地址值为运算量进展的运算。因指针运算是以指针变量所持有的地址值为运算量进展的运算。因此,指针运算的本质是地址的计算。由于指针是持有地址量的此,指针运算的本质是地址的计算。由于指针是持有地址量的变量这一特性,指针的运算与普通变量的运算在种类上和意义变量这一特性,指针的运算与普通变量的运算在种类上和意义上都是不同的。指针运算的种类是有限的,它只能进展取地址上都是不同的。指针运
7、算的种类是有限的,它只能进展取地址和取值运算、算术运算、关系运算和赋值运算。和取值运算、算术运算、关系运算和赋值运算。 假设阐明了一个指针,并使其值为某个变量的地址,那么可以经假设阐明了一个指针,并使其值为某个变量的地址,那么可以经过这个指针间接地访问在这个地址中存储的值。过这个指针间接地访问在这个地址中存储的值。1-64 4 常指针与指针常量常指针与指针常量修饰词修饰词 constconst是是C言语的一种关键字,起受维护,防止以外的变言语的一种关键字,起受维护,防止以外的变动的作用!可以修饰变量,参数,前往值动的作用!可以修饰变量,参数,前往值,甚至函数体。甚至函数体。const 修饰变量
8、,表示该变量不能被修正。修饰变量,表示该变量不能被修正。 1、const char *p 表示表示 指向的内容不能改动,叫常量指向的内容不能改动,叫常量指针。指针。 2、char * const p,就是将,就是将p声明为指针常量,它的地声明为指针常量,它的地址不能改动,是固定的,但是它的内容可以改动。址不能改动,是固定的,但是它的内容可以改动。 3、假设、假设const指针是前两种的结合指针是前两种的结合,使得指向的内容和使得指向的内容和地址都不能发生变化地址都不能发生变化. const double pi = 3.14159; const double *const pi_ptr = &a
9、mp;pi;教材教材54到到55页页1-75 5 多级指针多级指针当指针变量当指针变量pp所指的变量所指的变量ip又是一个指针时,又是一个指针时,pp是一是一种指向指针的指针,此时称指针变量种指向指针的指针,此时称指针变量pp是一种多级是一种多级指针。定义指向指针变量的指针变量的普通方式为:指针。定义指向指针变量的指针变量的普通方式为: 类型阐明符类型阐明符 * 变量名;变量名; 该普通方式阐明以下几个方面的内容:首先定义变量该普通方式阐明以下几个方面的内容:首先定义变量为指针变量,其次是该变量能指向一种指针对象,为指针变量,其次是该变量能指向一种指针对象,最后是被指向的指针对象能指向的对象的
10、类型。最后是被指向的指针对象能指向的对象的类型。 例例如如 int *pp, *ip, i; ip = &i; pp = &ip; 定义阐明定义阐明pp是指向指针的指针变量;它能指向的是是指向指针的指针变量;它能指向的是这样一种指针对象,该指针对象是能指向这样一种指针对象,该指针对象是能指向int型的指型的指针变量。如上述代码让针变量。如上述代码让pp指向指针变量指向指针变量ip,ip指向指向整型变量整型变量i。 1-86 6 指针的算术运算指针的算术运算 指针的算术运算是按指针的算术运算是按C言语地址计算规那么进展的,这言语地址计算规那么进展的,这种运算与指针指向的数据类型有
11、亲密关系,也就是种运算与指针指向的数据类型有亲密关系,也就是C言言语的地址计算与地址中存放的数据长度有关。设语的地址计算与地址中存放的数据长度有关。设px和和py是指向具有一样数据类型的一组假设干数据的指针,是指向具有一样数据类型的一组假设干数据的指针,n是整数,那么指针可以进展的算术运算有如下几种:是整数,那么指针可以进展的算术运算有如下几种:px+n,pxn,px+,+px, px,px,pxpy1-9指针与整数运算指针与整数运算 指针作为地址量加上或减去一个整数指针作为地址量加上或减去一个整数n,其意义是指,其意义是指针当前指向位置的前方或后方第针当前指向位置的前方或后方第n个数据的位置
12、。由于指个数据的位置。由于指针可以指向不同数据类型,即数据长度不同的数据,所针可以指向不同数据类型,即数据长度不同的数据,所以这种运算的结果值取决于指针指向的数据类型。例如,以这种运算的结果值取决于指针指向的数据类型。例如,假设有一单字节字符类型和另一个双字节整数类型:当假设有一单字节字符类型和另一个双字节整数类型:当字符指针加字符指针加1时,增量为时,增量为1,而整数指针加,而整数指针加1时,增量为时,增量为2。指针相减:指针相减: 设指针设指针p和和q是指向同一组数据类型一致的数据,那么是指向同一组数据类型一致的数据,那么pq运算的结果值是两指针指向的地址位置之间的数据运算的结果值是两指针
13、指向的地址位置之间的数据个数。个数。1-10两个指向同一组类型一样的数据的指针之间可以进展各种关系运算,运算结果为逻辑值,满足关系时,结果为真,否那么为假。如int a10,*p,*q; p=&a0; q=&a3; 那么p&a2 结果为0指向不同数据类型的指针之间的关系运算是没有意义的。指针与普通整数变量之间的关系运算也是无意义的。但是指针可以和零之间进展等于或不等于的关系运算,即:p= =0或p!=0,它们用于判别指针p能否为一个空指针。1-117 7 指针与数组指针与数组 指针在数组中运用较为频繁,现实上,数组名就是一个地址,表示的是该数组的首地址 。要访问或运用一
14、个数组元素,可以用三种不同的方法:下标法、地址法,还有一种是指针法。 可以设置指针变量指向数组或数组中的元素。 如:int a10, *p; 可以使整型指针p指向数组中任何一个元素, 假定给出赋值运算 p=&a0; 此时, p指向数组中的第0号元素, 即a0, 指针变量p中包含了数组元素a0 的地址, 由于数组元素在内存中是延续存放的, 因此, 我们就可以经过指针变量p及其有关运算间接访问数组中的任何一个元素。根据地址运算规那么, a+1为a1的地址, a+i就为ai的地址。 1-12 在定义指向数组的指针时,有以下几种表示方式:在定义指向数组的指针时,有以下几种表示方式: 1 int
15、 a10, *p = &a0; 2 int a10, *p = a; 3 int a10, *p; p = a ; 4int a10, *p; p = &a0; 5int a10; int *p = &a0;用指针表示数组元素的地址和内容的几种方式:用指针表示数组元素的地址和内容的几种方式: (1). p+i和和a+i均表示均表示ai的地址的地址, 或者讲或者讲, 它们均指向数组第它们均指向数组第i号元素号元素, 即指向即指向ai。 (2). *(p+i)和和*(a+i)都表示都表示p+i和和a+i所指对象的内容所指对象的内容, 即为即为ai。 (3). 指向数组元素的
16、指针指向数组元素的指针, 也可以表示成数组的方式也可以表示成数组的方式, 也也 就是说就是说, 它允许指针它允许指针变量带下标变量带下标, 如如pi与与*(p+i)等等 价。价。练习教材练习教材57页页5-5例题例题 。 1-138 8 指针数组指针数组数组中每个元素都是指针变量,该数组就称为指针数组。数组中每个元素都是指针变量,该数组就称为指针数组。 指针数组的定义方式为:指针数组的定义方式为: 类型标识类型标识 *数组名数组名整型常量表达式整型常量表达式; 例如例如: int *a10; 定义了一个指针数组定义了一个指针数组, 数组中的数组中的每个元素都是指向整型量的指针每个元素都是指向整
17、型量的指针, 该数组由该数组由10个元素组成个元素组成, 即即a0, a1, a2, ., a9, 它们均为指针变量。它们均为指针变量。a为该指为该指针数组名针数组名, 和数组一样和数组一样, a是常量是常量, 不能对它进展增量运算。不能对它进展增量运算。a为指针数组元素为指针数组元素a0的的 地址地址, a+i为为ai的地址的地址, *a就是就是a0, *(a+i)就是就是ai。1-149 9 指向数组的指针指向数组的指针int *a10; 定义了一个指针数组,本质是一个数组,每个元定义了一个指针数组,本质是一个数组,每个元素都是指针。素都是指针。int (*p)10; a为指向含为指向含1
18、0个元素的一维整型数组的指针变个元素的一维整型数组的指针变量。指向数组的指针是一个二级指针。量。指向数组的指针是一个二级指针。1-1510 10 指向二维数组指针的运用指向二维数组指针的运用int main() int twoArray34 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; int (*p)4 = twoArray; / 定义一个指向一维数组的指针定义一个指向一维数组的指针 for(p = twoArray; p != twoArray + 3; +p) / 第一层循环,每个循环遍历一行元素第一层循环,每个循环遍历一行元素 for(int *q =
19、 *p; q != *p + 4; +q) / 第二层循环,每次循环输出一个元素第二层循环,每次循环输出一个元素 cout *q ; cout endl; return 0; 1-16上图表示了二维数组的存储方法,上图表示了二维数组的存储方法,twoArray0twoArray2表示各一维数组的首地址,二表示各一维数组的首地址,二维数组名维数组名twoArray表示整个二维数组的首地址,它和表示整个二维数组的首地址,它和twoArray0以及以及twoArray00是同一个地址。但是他是同一个地址。但是他们表示的级别是不同的,因此不能混用。们表示的级别是不同的,因此不能混用。twoArray1
20、是元素级别的,是是元素级别的,是int*,而,而&twoArray1是是行级别的,是行级别的,是int(*p)4。也就是说,假设对。也就是说,假设对twoArray1加加1,那么指针挪动到下一个元素的位置,而假设对,那么指针挪动到下一个元素的位置,而假设对&twoArray1加加1,指针挪动到下一行的位置:,指针挪动到下一行的位置:1-1711 11 指针与字符串指针与字符串字符串常量是由双引号括起来的字符序列字符串常量是由双引号括起来的字符序列 ,C+言语中操作一言语中操作一个字符串常量的方法有个字符串常量的方法有: (1). 把字符串常量存放在一个字符数组之中把字符串常量存
21、放在一个字符数组之中, 例如例如: char s=a string; 数组数组s共有共有9个元素所组成个元素所组成, 其中其中s8中的内容是中的内容是0。实践上。实践上, 在字符数组定义的过程中在字符数组定义的过程中, 编译程序直编译程序直接把字符串复写到数组中接把字符串复写到数组中, 即对数组即对数组s初始化。初始化。 (2). 用字符指针指向字符串用字符指针指向字符串, 然后经过字符指针来访问字符然后经过字符指针来访问字符串存贮区域。当字符串常量在表达式中出现时串存贮区域。当字符串常量在表达式中出现时, 根据数组的类根据数组的类型转换规那么型转换规那么, 它被转换成字符指针。因此它被转换成
22、字符指针。因此, 假设我们定义了一假设我们定义了一字符指针字符指针cp: char *cp; 于是可用于是可用: cp=“a string; 使使cp指向字符串常量中的第指向字符串常量中的第0号字符号字符a,以后我们可经过以后我们可经过cp来访问这来访问这一存贮区域一存贮区域, 如如*cp或或cp0就是字符就是字符a, 而而cpi或或*(cp+i)就相当就相当于字符串的第于字符串的第i号字符号字符 。1-1812 12 动态内存分配动态内存分配在在C言语中运用言语中运用“malloc()函数来恳求内存,运用函数来恳求内存,运用“free()函数来释放内存。在函数来释放内存。在C+言语中依然可以
23、言语中依然可以运用这种方法,但是不建议运用该方法。运用这种方法,但是不建议运用该方法。C+言语言语提供了提供了new表达式和表达式和delete表达式来恳求和释放内存。表达式来恳求和释放内存。用用new表达式创建动态的类对象,它的寿命期由创建开表达式创建动态的类对象,它的寿命期由创建开场,释放时终了,定义格式为,场,释放时终了,定义格式为,“new ();,其中初始值是可选项,假设给出了初始,其中初始值是可选项,假设给出了初始值,系统会自动调用相应的构造函数初始化新创建值,系统会自动调用相应的构造函数初始化新创建的类对象,否那么调用缺省构造函数进展初始化。的类对象,否那么调用缺省构造函数进展初
24、始化。1-19例如,例如,int *p;/整数类型指针整数类型指针 float *f;/浮点类型指针浮点类型指针p = new int;/为一个整数类型的数分配内存为一个整数类型的数分配内存f = new float; /为一个浮点类型的数分配内存为一个浮点类型的数分配内存假设胜利调用了假设胜利调用了new,那么前往一个指向已分配空间的,那么前往一个指向已分配空间的指针,假设此空间不可用或检测到某些错误,那么指针,假设此空间不可用或检测到某些错误,那么前往零。为对象分配内存运用同样的语法,例如,前往零。为对象分配内存运用同样的语法,例如,person *stu_ptr; /指向类型为指向类型为person 对象的指针对象的指针 stu_ptr = new person(); /指向新的指向新的 person 对象对象 假设不再需求所分配的存储空间,要用假设不再需求所分配的存储空间,要用delete释放,例释放,例如:如: delete p; delete f;1-20动态改动数组的大小:动态改动数组的大小: int *a=new int40; for(int i=0;i40;i+) ai=i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030全球3D生物打印植入物行业调研及趋势分析报告
- 2024年军队文职人员招聘考试题库二
- 2025年度旅游产业转型升级个人咨询服务协议
- 2025版文化产业投资合作开发协议3篇
- 2025版住宅小区物业委托维护管理协议3篇
- 二零二五年度艺术场地租赁合同中的艺术创作与展览指导2篇
- 二零二五年度阿拉尔经济技术开发区环保产业合作开发合同3篇
- 2024版影视器材租赁合同下载
- 2025版房地产销售合同标准模板
- 2024糯玉米采购协议书
- 广东省深圳市2024-2025学年高一上学期期末考试英语试题(含答案)
- 医药行业2025年策略报告:曙光初现机遇增加
- 社会主义核心价值观课件
- 《公路养护安全培训》课件
- 第七讲推动构建新时代的大国关系格局-2024年形势与政策(课件)
- 2024年高考真题-化学(天津卷) 含解析
- 医院食材采购与配送实施方案
- 文书模板-护理规培生座谈会记录
- 2025年高考作文备考:议论文写作的论证手法
- 投饵机相关项目实施方案
- 2024年可行性研究报告投资估算及财务分析全套计算表格(含附表-带只更改标红部分-操作简单)
评论
0/150
提交评论