资源描述:
《C语言:指向数组的指针及容易混淆的概念.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言:指向数组的指针及容易混淆的概念。txt心脏是一座有两间卧室的房子,一间住着痛苦,一间住着快乐.人不能笑得太响,否则会吵醒隔壁的痛苦。当年学C语言的时候,指针部分并没有学得很扎实……几种不常用的指针:int(*p)[4]ﻩ指向数组的指针,指向形如inta[4]的数组int(*p)()ﻩﻩ指向函数的指针,该函数返回 int 值int **pﻩ指向指针的指针,指向 一个指向int变量的指针===============================对比===============================int(*p)[4]int* p [4]其中后者是包含4个int *类
2、型元素的指针数组int(*p)()int*p ()其中后者是一个返回int *类型数据的函数int(*p)[4]int**pﻩ这个问题需要详细讨论—-ﻩ我们知道,数组下标运算如a[3]实际上就是*(a+3),但是*(a+3)这样的运算,并非简单将地址(常量或者变量)加上3后取内存单元的值,而是 a+3*sizeof(…)再取内存单元的值.可以称sizeof(…)为“步进”。这样每一个指针变量在声明时就必须有基本数据类型,比如:ﻩ声明ﻩ基本型步进ﻩ—----—-—---——---—-—-------—----——---——-—-ﻩint*pﻩﻩintﻩﻩintint**pint*ﻩﻩpo
3、interint(*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]的意思是:ﻩ
4、先从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]的意思是
5、:先从 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在
6、第一次下标运算后,得到的是一个指针常量,这个常量并未被分配内存单元,而是由编译器在link 时直接获得其数值。+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ﻩ用“指向指针的指针”索引数组元素固然可以,但是要建额外的(由指针变量构成的)索引表;而使用“指向数组的指针”来操作数组,就能和用数组名—-数组本身的地址常量--一样方便。例如:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++typedefunsigned charCT
7、ype;typedefCType(*Pointer_2D)[Nb];ﻩ/*用于直接引用Surface[i][][]这样一个2D数组的指针类型*/CType Surface[N3D][Nb][Nb];Pointer_2D CTotal=Surface[0],ﻩA=Surface[1],ﻩA2=Surface[2],B=Surface[3],B2=Surface[4],ﻩAB=Surface[5];这里,A、A2、……都是“指向一维数组的指针”,而