预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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*p int int int**p int* pointer int(*p)[4] inta[4] 4*int int(*p)() func 编译器确定 ----------------------------------------- int*PT[4] 这是数组,包含4个int*p int*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],