现在的位置: 首页 > 综合 > 正文

12-4-26关于普通函数指针,类成员函数指针,char(*)[]

2017年11月14日 ⁄ 综合 ⁄ 共 850字 ⁄ 字号 评论关闭

1,普通函数指针

例子:

通过上面的代码,我们可以得到函数指针的初始化,调用情况

2,类成员函数指针

我们可以发现,成员函数指针类型初始化,调用是不同于一般的函数指针

3,下面我们重点谈谈char (*p)[3],char p[3]

char (*p)[3]定义了一个指向char型的数组的指针,等同于char p[][3],这里p+1,就是第二行的首地址了

char p[3]定义了一个char 型数组

我们再来看代码,例如,char p[3]:其中p就是数组的首地址,其类型为char *,而&p是表示数组的地址。类型为char (*)[3],经过编译得到结论其实二者在数值上是相等的。

但是,二者是不等同的,char (*p)[3] 中 p 与p+1的差距为3*sizeof(char p[3]),这就是char (*)[3]类型的震撼之处

因此char (*p)[3]的p是一个指针,它代表了3个元素。他是名符其实的指向了整块数组

char p[3]的p也是指针,但是他仅代表了&p[0],一个元素。确切点就是该元素的地址

4,关于sizeof

数组名a代表数组首地址, &a代表的是数组地址,两个sizeof效果一样都是16,但是a+0代表的是指向0号元素的指针 ,那么就是4了.

当然我们这里的cpu寻址地址为32位的。编译器是vc 6.0

如果a为二维数组名,sizeof(a)则是整个数组所占的空间。

设a为两行四列的整型数组

sizeof(a)代表的是整个二维数组的大小,*a表示*(a+0),*a代表的是第一行一维数组的首地址,sizeof(*a)=16

而&a[0]等价&(*(a+0)),其中&与*抵消,相当于a+0,数组名参与了指针偏移运算,sizeof(&a[0])=4

&a[0][0]等价&(*(*(a+0)+0)),当&与*抵消后, 为*(a+0)+0,而*(a+0)代表第一行一维数组的首地址,而他参与了偏移运算,sizeof(&a[0][0])则为4

因此不管几维,重点参考数组名是否参与偏移运算。一旦参与,sizoe()就是指针在内存的大小了

抱歉!评论已关闭.