c语言:指向数组的指针及容易混淆的概念

c语言:指向数组的指针及容易混淆的概念

ID:8959193

大小:26.50 KB

页数:3页

时间:2018-04-13

上传者:U-5734
c语言:指向数组的指针及容易混淆的概念_第1页
c语言:指向数组的指针及容易混淆的概念_第2页
c语言:指向数组的指针及容易混淆的概念_第3页
资源描述:

《c语言:指向数组的指针及容易混淆的概念》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭