


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、水滴石穿C语言之指针、数组和函数根本解释1、 指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置地址;数组 的本质那么是一系列的变量。2、数组名对应着而不是指向一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是可变,所以我们常用指针来操作动态内存。3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。问题:指针与数组听说char a与char *a是一致的,是不是这样呢?答案与分析:指针和数组存在着一些本质的区别。当然,在某种情况下,比方数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内
2、部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比拟特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:char a = "Hi, pig!"char *p = "Hi, pig!"上述两个变量的内存布局分别如下:数组a需要在内存中占用 8个字节的空间,这段内存区通过名字a来标志。指针p那么需要4个字节的空间来存放地址,这4个字节用名字p来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指,即空指针。目前这个p指向某地连续的8个字节,即字符串 “Hi, pig!。另外,例如:对于a2和p2,二者都返回字符,但是编译器产
3、生的执行代码却不一样。对于a2,执行代码是从a的位置开始,向后移 动2两个字节,然后取出其中的字符。 对于p2,执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。问题:数组指针为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?答案与分析:使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比方在高维需要动态生成情况下的多维数组。定义例子如下:in t (*pEleme nt)2。下面是一个例子:int array23 = 1,2,3,4,5,6;in t (*pa)3; /定
4、义一个指向数组的指针pa = &arrayO; / &符号能够表达pa的含义,表示是指向数组的指针printf (d", (*pa)0); / 将打印 arrayOO,即 1pa+ ;/猜一猜,它指向谁? array1 ?对了!printf ("%d", (*pa)0); / 将打印 array10,即 4上述这个例子充分说明了数组指针一一种指向整个数组的指针的定义和使用。需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的, 因此,pa+将整个向后移动一个数组的尺寸,而不是仅仅向后移动一个数组元素的尺寸。问题:指针数组有如下
5、定义:struct UT_TEST_STRUCT *pTo2MAX_NUM;请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?答案与分析:前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两 者的定义呢?分析如下:数组指针是:指向数组的指针,比方in t (*pA)5。指针数组是:指针构成的数组,比方int *pA5。至于上述指针数组的好处,大致有如下两个很普遍的原因:a)、各个指针内容可以按需要动态生成,防止了空间浪费。b)、各个指针呈数组形式排列,索引起来非常方便。在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。问题:指向指针的指针在做一个文本处
6、理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?答案与分析:首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。现实中我们尝试用动态二维数组本质就是指向指针的指针来解决此问题:图示是一个指针数组。所谓动态性指横向对应每行文本的字符个数和纵向对应整个文本的行数两个方向都可以变化。就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。就竖向而言,可以动态生成及扩展需
7、要的指针数组的大小。下面的代码演示了这种动态数组的用途:/用于从文件中读取以'0'结尾的字符串的函数extern char *getli neFILE *pFile;FILE *pFile;char *ppText = NULL; /二维动态数组指针char *pCurrText = NULL ;/指向当前输入字符串的指针ULONG ulCurrLi nes = 0;ULONG ulAllocedL in es = 0:while ( p = getline(pFile) if (ulCurrL ines >= ulAllocedL ines)/ *当前竖向空间已经不够了
8、,通过realloc对其进行扩展。ulAllocedLines += 50; /每次扩展 50 行。ppText = realloc (ppText, ulAllocedL ines * (char *); if (NULL = ppText)return; / 内存分配失败,返回 ppTextulCurrLines+ = p; II横向 扩展指向不定长字符串问题:指针数组与数组指针与指向指针的指针指针和数组分别有如下的特征: 指针:动态分配,初始空间小 数组:索引方便,初始空间大 下面使用高维数组来说明指针数组、数组指针、指向指针的指针各自的适合场合。多维静态数组:各维均确定,适用于整体空间
9、需求不大的场合,此结构可方便索引,例a1040。数组指针:低维确定,高维需要动态生成的场合,例ax40。指针数组:高维确定,低维需要动态生成的场合,例a10y。指向指针的指针:高、低维均需要动态生成的场合,例axy。问题:数组名相关问题假设有一个整数数组a,a和&a的区别是什么?答案与分析:a = &a = &a0,数组名a不占用存储空间。需要引用数组(非字符串)首地址的地方,我一般使用&a0,使用a容易和指针混淆,使用 &a容易和非指针变量混淆。区别在于二者的类型。对数组a的直接引用将产生一个指向数组第一个元素的指针, 而&a的结果那么产生一个指向全部数组的指针。例如:int a2 = 1,2;int *p = 0;p = a; /* p 指向a0所在的地方 */x = *p; /* x = a0 = 1*/p = &a; /*编译器会提示你错误,*/*显示整数指针与整数数组指针不一样*/问题:函数指针与指针函数请问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机车乘务面试题及答案
- 注册土木工程师考试热点试题及答案
- 2025-2030中国塑料包装行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国呼吸器行业市场深度调研及发展趋势和前景预测研究报告
- 网游安全测试题及答案
- 2025-2030中国厕所扶手行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国单槽瓦楞纸板行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国半挂车行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国制卡服务行业市场现状分析及竞争格局与投资发展研究报告
- 2025-2030中国冰鞋行业市场发展分析与发展趋势及投资风险研究报告
- 私人向公司借款协议书
- 妇科一病一品护理汇报
- 大学生心理健康教育-大学生心理健康
- 精密干涉传感技术与应用 - 干涉条纹与zernike多项式
- 2024住院患者静脉血栓栓塞症预防护理与管理专家共识要点(全文)
- 2024-2030年中国有机肥产业应用态势及投资盈利预测报告
- 钢结构工程施工应急处置措施
- 施工损坏赔偿协议书
- 2024年湖北省十堰市荆楚初中联盟八年级中考模拟预测生物试题
- 2024年北京东城区高三二模地理试题和答案
- 幼儿园一等奖公开课:大班绘本《爱书的孩子》课件
评论
0/150
提交评论