版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数组与指针数组与指针指针和一维数组指针和一维数组指针和二维数组指针和二维数组动态内存分配函数动态内存分配函数数组与指针数组与指针 n 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。n 指针变量既然可以指向变量,当然也可以指向数组元素把某一元素的地址放到一个指针变量中)。n 数组元素的指针就是数组元素的地址。 n 可以用一个指针变量指向一个数组元素可以用一个指针变量指向一个数组元素n int a10=1,3,5,7,9,11,13,15,17,19;n int *p;n p=&a0;等价于等价于p=a;等价于等价于int *p=a;或或in
2、t *p=&a0;留意:数组名留意:数组名a不代表整个数组,不代表整个数组,只代表数组首元素的地址。只代表数组首元素的地址。p=a;的作用是的作用是“把把a数组的首元素数组的首元素的地址赋给指针变量的地址赋给指针变量p”,而不是,而不是“把数组把数组a各元素的值赋给各元素的值赋给p”。指针与一维数组指针与一维数组在引用数组元素时指针的运算在引用数组元素时指针的运算在指针指向数组元素时,允许以下运算:在指针指向数组元素时,允许以下运算: 加一个整数加一个整数(用用+或或+=),如,如p+1 减一个整数减一个整数(用用-或或-=),如,如p-1 自加运算,如自加运算,如p+,+p 自减运算
3、,如自减运算,如p-,-p 两个指针相减,如两个指针相减,如p1-p2 (只有只有p1和和p2都指向同一数组都指向同一数组中的元素时才有意义中的元素时才有意义)n 如果指针变量如果指针变量p已指向数组中的一个元素,则已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,指向同一数组中的下一个元素,p-1指向同一数组指向同一数组中的上一个元素。中的上一个元素。n 例:例:float a10, *p=a;n 假设假设a0的地址为的地址为2000,那么:,那么:n p的值为的值为2000n p+1的值为的值为2019n p-1的值为的值为2019越界越界n 如果的初值为&a0,则p+i
4、和a+i就是数组元素ai的地址,或者说,它们指向a数组序号为i的元素n*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 *(p+i)通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:引用一个数组元素,可以用:()() 下标法,如下标法,如ai方式;方式;()() 指针法,如指针法,如*(a+i)或或*(p+i);其中;其中a是数组名,是数组名,p是指向数组元素的指针变量,其初值是指向数组元素的指针变量,其初值p=a。例:输出数组中的全部元素。例:输出数组中的全部元素。 假
5、设int a5,要输出各元素的值有四种方法: (1)下标法。下标法。(2) 通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。(3) 用指针变量指向数组元素。用指针变量指向数组元素。虽然虽然p和和a的值都是数组的首地址,但是数组名的值都是数组的首地址,但是数组名a不能执行不能执行增增1或减或减1操作。因为数组名是指针常量,代表一个地址常操作。因为数组名是指针常量,代表一个地址常量,其值不能改变;指针是变量,其值可以改变。量,其值不能改变;指针是变量,其值可以改变。3 3种方法的比较:种方法的比较: 第第(1)(1)和第和第(2)(2)种方法执行效率相同种方法执
6、行效率相同编译系统是将编译系统是将aiai转换为转换为* *(a+i)(a+i)处理的,即先计算元素地址。处理的,即先计算元素地址。因此用第因此用第(1)(1)和第和第(2)(2)种方法找数组元素费时较多。种方法找数组元素费时较多。 第第(3)(3)种方法比第种方法比第(1)(1)、第、第(2)(2)种方法快种方法快用指针变量直接指向元素,不必每次都重新计算地址,像用指针变量直接指向元素,不必每次都重新计算地址,像p+p+这样的自加操作是比较快的这样的自加操作是比较快的这种有规律地改变地址值这种有规律地改变地址值(p+)(p+)能大大提高执行效率能大大提高执行效率 用下标法比较直观,能直接知道
7、是第几个元素。用下标法比较直观,能直接知道是第几个元素。 用地址法或指针变量的方法不直观,难以很快地判断出当用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。前处理的是哪一个元素。(4)指针的下标法指针的下标法数组名和指针变量作函数参数数组名和指针变量作函数参数a+i*(a+i);被调函数的形参声明为被调函数的形参声明为数组类型,用指针法访数组类型,用指针法访问数组元素问数组元素指针与二维数组指针与二维数组n 二维数组可以看作一维数组,其每个数组元素又是一个一维数组a00a01a02aa0a1a10a11a12a00a01a02aa0a1a10 a11a12a0可以看做可
8、以看做3个短整型元素组成的一维数组的数组名个短整型元素组成的一维数组的数组名a00a01a02a0a1a10a11a12n 如果将二维数组名如果将二维数组名a看成一个行地址第看成一个行地址第0行),则行),则a+i表示二维数组第表示二维数组第i行的地址,行的地址,ai可看成一个列地址,可看成一个列地址,即第即第i行第行第0列的地址。列的地址。n 行地址行地址a加加1a+1),表示指向下一行;列地址),表示指向下一行;列地址ai加加1( ai +1),表示指向下一列),表示指向下一列二维数组的行指针与列指针二维数组的行指针与列指针i2;j3;i2;j3;注:注:mn个元素的二维数组个元素的二维数
9、组int a34=1,3,5,7,9,11,13,15,17,19,21,23;135791111131517192123a0a1a2aa+1a+2a0a0+1 a0+2 a0+3行指针行指针列指针列指针a代表第代表第0行首地址行首地址a+1代表第代表第1行首地址行首地址a+2代表第代表第2行首地址行首地址1357911131517192123a0a1a2aa+1a+2a0a0+1 a0+2 a0+3行指针行指针列指针列指针行指针每加行指针每加1,走一行,走一行a+i代表行号为代表行号为i的行首地址按行变化)的行首地址按行变化)*(a+i)代表什么?代表什么?13579111315171921
10、23a0a1a2aa+1a+2a0a0+1 a0+2 a0+3行指针行指针列指针列指针相当于相当于aia0代表代表a00的地址的地址a0+1代表代表a01的地址的地址a0+2代表代表a02的地址的地址a0+3代表代表a03的地址的地址1357911131517192123a0a1a2aa+1a+2a0a0+1 a0+2 a0+3行指针行指针列指针列指针列指针每加列指针每加1,走一列,走一列a1代表谁的地址?代表谁的地址?a1+1代表谁的地址?代表谁的地址?a1+2代表谁的地址?代表谁的地址?a1+3代表谁的地址?代表谁的地址?1357911131517192123a0a1a2aa+1a+2a0
11、a0+1 a0+2 a0+3行指针行指针列指针列指针ai+j代表谁的地址?代表谁的地址?1357911131517192123a0a1a2aa+1a+2a0a0+1 a0+2 a0+3行指针行指针列指针列指针代表代表aij的地址的地址*(ai+j)代表什么?代表什么?代表元素代表元素aij*(*(a+i)+j)代表什么?代表什么?与与*(ai+j)等价等价动态数组动态数组栈堆静态存储区常量存储区代码区动态动态存储存储区区只读只读存储存储区区低地址区低地址区高地址区高地址区n 非静态的局部变量是分配在内存中的动态存储区非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域的,
12、这个存储区是一个称为栈的区域n C语言还允许建立内存动态分配区域,以存放一语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆区自由存储区,称为堆区n 对内存的动态分配是通过系统提供的库函数来实对内存的动态分配是通过系统提供的库函数来实现的,主要有现的,主要有malloc,calloc,free,realloc这这4个函个函数。数。n 使用这些函数,要在程序开头将头文件使用这些函数,要在程序开头将头文件包含到源程序
13、中。即在用到这些函数时应当用包含到源程序中。即在用到这些函数时应当用#include 指令把指令把stdlib.h头文件包含到程序头文件包含到程序文件中。文件中。函数原型为函数原型为 :void *malloc(unsigned int size); 作用:是在内存的动态存储区中分配一个长度为作用:是在内存的动态存储区中分配一个长度为size的连续空间的连续空间(1) malloc函数函数例:例:malloc(100);开辟开辟100字节的临时分配域字节的临时分配域留意:留意:指针的基类型为指针的基类型为void,即不指向任何类型的数据,只,即不指向任何类型的数据,只提供一个地址提供一个地址如
14、果此函数未能成功地执行例如内存空间不如果此函数未能成功地执行例如内存空间不足),则返回空指针足),则返回空指针(NULL)例:例:int *p=NULL; p=(int *)malloc(2) 若不清楚相应数据类型所占字节数,那么若不清楚相应数据类型所占字节数,那么 p=(int *)malloc(sizeof(int)函数原型为函数原型为 :void *calloc(unsigned n,unsigned size); 作用:是在内存的动态存储区中分配作用:是在内存的动态存储区中分配n个长度为个长度为size的的连续空间,这个空间一般比较大,足以保存一个数组。连续空间,这个空间一般比较大,足
15、以保存一个数组。用用calloc函数可以为一维数组开辟动态存储空间,函数可以为一维数组开辟动态存储空间,n为为数组元素个数,每个元素长度为数组元素个数,每个元素长度为size。这就是动态数组。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配函数返回指向所分配域的起始位置的指针;如果分配不成功,返回不成功,返回NULL。(2) calloc函数函数例:例:p=calloc(50,4);开辟开辟504个字节的临时分配域,把起始地址赋给指针变量个字节的临时分配域,把起始地址赋给指针变量p 函数原型为函数原型为 :void *free(void *p); 作用:是释放指针变量所指向的动态空间,使这作用:是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量使用。部分空间能重新被其他变量使用。p应是最近一次应是最近一次调用调用calloc或或malloc函数时得到的函数返回值。函数时得到的函数返回值。(3) free函数函数函数原型为:函数原型为:void *realloc(void *p, unsigned int size);如果已经
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026统计学国企面试题及答案
- 2026文化自信面试题目及答案
- 厨师薪酬合同范本
- 个人旅行意外伤害处理供旅行者预案
- 申请2026年扩展代理服务确认函7篇范本
- 利用高铝粉煤灰制备100万吨硅铝合金源网荷储一体化项目可行性研究报告模板申批拿地用
- 2026年双鸭山市尖山区网格员招聘笔试参考题库及答案详解
- 客服中心在线客服话术培训工作手册
- 2026年陕西省商洛市事业编单位人员招聘考试参考题库及答案详解
- 2026年桂林市秀峰区社区工作者招聘笔试模拟试题及答案详解
- 猪场种猪购买合同范本
- 2026年全国硕士研究生考试(英语一)真题及答案
- (11.5)-4.3.1高原珍宝红景天中药养颜秘籍
- 仁清参考资料法师:四部宗义精要
- 农业银行境外汇款申请书样板
- JJG 921-2021环境振动分析仪
- SB/T 10468.2-2012轮胎理赔技术规范
- GB/T 308.1-2013滚动轴承球第1部分:钢球
- GA/T 1323-2016基于荧光聚合物传感技术的痕量炸药探测仪通用技术要求
- 学校问题整改情况台账
- 二年级上册数学课件-6.12 找规律填数整理丨苏教版 (共20张PPT)
评论
0/150
提交评论