C语言:指向数组的指针及容易混淆的概念.doc_第1页
C语言:指向数组的指针及容易混淆的概念.doc_第2页
C语言:指向数组的指针及容易混淆的概念.doc_第3页
全文预览已结束

下载本文档

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

文档简介

C语言:指向数组的指针及容易混淆的概念.txt心脏是一座有两间卧室的房子,一间住着痛苦,一间住着快乐。人不能笑得太响,否则会吵醒隔壁的痛苦。当年学C语言的时候,指针部分并没有学得很扎实几种不常用的指针:int (* p)4指向数组的指针,指向形如 int a4 的数组int (* p)()指向函数的指针,该函数返回 int 值int * p指向指针的指针,指向 一个指向int变量的指针=对比=int (* p)4int * p 4其中后者是包含4个 int * 类型元素的指针数组int (* p)()int * p ()其中后者是一个返回 int * 类型数据的函数int (* p)4int * p这个问题需要详细讨论我们知道,数组下标运算如 a3 实际上就是 *(a+3),但是*(a+3)这样的运算,并非简单将地址(常量或者变量)加上3后取内存单元的值,而是 a+ 3*sizeof() 再取内存单元的值。可以称 sizeof()为“步进”。这样每一个指针变量在声明时就必须有基本数据类型,比如: 声明基本型步进-int * pintintint * pint *pointerint (*p)4int a44 * intint (*p)()func编译器确定-int * PT4这是数组,包含4个 int * pint * FN()这是函数,返回1个 int * p其实 int * p 的指针等级相当于 int * PT4,不过这里的 PT是指针常量而p是指针变量,可以p=PT,即把PT4数组的首地址赋值给指针p 。p用于存放那些指针变量在内存中的地址,可以用于索引这组int变量,所以说它是“指向指针的指针”,第一级步进为“pointer”型的长度。pXY 的意思是:先从 p + X* sizeof(“pointer”)处读取指针变量的值 pX,再从 pX + Y* sizeof(int) 处读取 int型变量的值pXY。相比而言,int (* Pa)4叫做“指向数组的指针”,具体到这里就是一个指向一维数组的指针,假设赋值 Pa=&a(事先声明int a4)。那么Pa 就用于存放一维数组a4在内存中的首地址“&a”显然 &aa,a是 int型变量的地址常量,而 &a是 int*型常量 a的“地址常量”!不过显然a、&a以及Pa 在数值上是完全一样的 &a是 a数组行的地址常量,而a则是数组首元素a0 的地址常量。PaXY 的意思是:先从 Pa + X* sizeof(int) *4 处读取地址常量 PaX,再从 PaX + Y* sizeof(int) 处读取 int型变量的值 PaXY。注意按照一般的指针操作,PaX 应该代表 Pa向后偏移X 个步进处的值,具体而言就是Pa向后偏移X个“int 4”数组长度后的那个“int 4”数组。但是,读取 PaX 这样“一个数组”是什么意思呢?在C语言里就相当于读取这个数组的首地址。然后可以再从这个首地址偏移Y 步进,读取 PaXY。可见,“指向指针的指针”p 在第一次下标运算后,得到的是一个指针变量内存单元中的值指针变量;而“指向数组的指针”Pa 在第一次下标运算后,得到的是一个指针常量,这个常量并未被分配内存单元,而是由编译器在link 时直接获得其数值。+用“指向指针的指针”索引数组元素固然可以,但是要建额外的(由指针变量构成的)索引表;而使用“指向数组的指针”来操作数组,就能和用数组名数组本身的地址常量一样方便。例如:+typedef unsigned char CType;typedef CType (* Pointer_2D)Nb;/*用于直接引用Surfacei这样一个2D数组的指针类型*/CType SurfaceN3DNbNb;Pointer_2D CTotal=Surface0,A =Surface1,A2=Surface2,B =Surface3,B2=Surface4,AB=Surface5;这里,A、A2、都是“指向一维数组的指针”,而Surface1、Surface2、则是相应的二维数组名,换句话说是二维数组本身的地址。如果访问 A34,那就相当于访问 Surface134:“指向一维数组的指针”

温馨提示

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

评论

0/150

提交评论