指针数组,数组指针,函数指针,函数指针数组

今天来聊一下高级指针,首先,在我们开始聊的时候,我们先从字面上区分其类型。以后当我们第一眼看到的字面上结尾为“指针”两个字的时候,我们就要第一反应为,这一长串的表达式为指针,那么就按照指针进行操作它。当第一眼看到结尾为“数组”两个字,那么就第一反应就得把它当数组来进行对待。

现在,来讲一讲数组指针,指针数组,函数指针,函数指针数组的概念。

数组指针:指向数组的指针。

指针数组:里面存指针的数组。

函数指针:指向函数的指针。

函数指针数组:里面存放函数指针的数组。

1.数组指针:这位一个指针,在32位机器上,大小为四个字节。

例: 

int (*p)[4];

上面即为一个数组指针的写法,解读为:指向一个大小为4的int型数组。

如上图可得,p为一个指向有四个int类型的数组。

*p=数组首元素值;

&p = 指针p的地址,相当于一个二级指针。

2.指针数组:这是数组,大小为   sizeof(数组名);

int *p[4];

 

上面为一个指针数组,其中p表示数组名称,p中存放了4个指针,每个指针都是指向int型。

根据上面的图可知,现在的 p 表示的就是整个数组了。数组里面装的是4个指向  int  类型的指针。

*p = 数组p中首元素的值,即为一个指针。

&p = 为数组p的首地址。

上述的两种情况,从形式上看为,一种形式有括号,另一种形式为不加括号

这是考虑到 “优先级”,[ ]的优先级大于*

3.函数指针:为一个指针,指向函数,在32位机器上,大小为4.

void (*p)(int,int);

 

由上图可清晰的看出,p表示指向一个返回值为空,参数列表为(int,int)的函数。

 

4.函数指针数组:就跟理解指针数组没什么差别,函数指针数组就是数组里面存放的为指向函数的指针。

下面一起看一道数组与指针和数组的相关的有意思的题

int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a +1);
printf("%d","%d",*(a+1),*(ptr-1));
return 0;
}

 上述的题中分别是一个数组和一个指针

其中

(&a+1):首先考虑优先级问题,得出来&a,就是取数组a首地址的值,然后再对&a进行+1操作(就是对指针进行+1操作)。

所以相当于&a+sizeof(a) 就相当于&a +5sizeof(int)。也就是说这一坨表示的位置就是a数组下一个数组的首地址的位置,然后

再将其强转为(int*)型的指针再将其赋值给ptr(自行脑补ptr指向a[5]处的位置)。强转的意义在于,若不强转,一旦进行指针加减1运算时,就是5个int型的长

度。

*(a+1):表示数组首元素地址+1,再进行解引用,首元素地址+1,就是到了数组中的a[1]的位置,再解引用取得该位置上的

值。

*(ptr-1):ptr为一个int*的指针,现在它指向a数组下一个数组的首地址的位置(我理解为a[5]的位置),然后再进行-1,此时就

到了a[4]的位置上,然后再解引用,取得该位置上的值。

好了,不说了今天就到这了,又接着写代码咯。

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/volatile_0524/article/details/81334251
今日推荐