指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

    在判断指针数组,数组指针,函数指针,指向函数指针数组的指针时,最重要的是先判断它本质到底是数组还是指针,那么问题来了,怎样判断是数组还是指针呢,其实在判断某一个之前,需要知道优先级的大小,优先级:( )>[ ]>*,如果变量名先与[ ]结合,就是数组,如若先与*结合,就为指针。

1.指针数组:它是数组,是一个存放指针的数组

    int *arr1[10] ;char *arr2[4]; char **arr3[5],很明显,arr1,arr2,arr3都是先与[ ]相结合的,都属于指针数组。

2.数组指针:它是指针,是一个指向数组的指针

    我们看一个简单的数组指针的定义:

    int (*p) [10];//p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整形的数组,所以p是一个数组指针,这里要注意:[ ]的优先级是高于*的,所以必须加上( )来保证p和*先结合。

    那数组的地址如何来存储?

int arr[10]={0};
int *p1=&arr;
int (*p2)[10]=&arr;

   

     结果很明确,p2是比较合适的选择,p2是数组指针,所以存放数组的地址是合适的。

3.函数指针:它是指针,指向一个函数的地址

#include <stdio.h>

void test()
{
	printf("Hello World!");
}

int main()
{
	void (*pfun)()=test;
	printf("%p\n",pfun);
	printf("%p\n",test);
	return 0;
}

    注意函数名或者&函数名都表示函数的地址


    pfun可以存放, pfun先和*结合。说明 pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。

4函数指针数组:是一个数组,存放函数的地址

    pfun先和[ ]结合。说明pfun是数组,数组的内容是int(*)( )类型的函数指针。

#include <stdio.h>
int test()
{
	printf("Hello World!");
}
int main()
{
	int (*pfun[10])();
	pfun[0]=&test;
	printf("%p\n",pfun[0]);
	printf("%p\n",test);
	return 0;
}

5.指向函数指针数组的指针:它是一个指针,指针指向一个数组,数组的元素都是函数指针

#include <stdio.h>
void test()
{
	printf("Hello World!");
}
int main()
{
	//函数指针pfun
	void (*pfun)()=test;
	//函数指针的数组pfunArr
	void (*pfunArr[5])();
	//指向函数指针数组pfunArr的指针ppfunArr
	void (*(*ppfunArr)[10])()=&pfunArr;
	pfunArr[0]=test;
	printf("%p\n",test);
	printf("%p\n",pfunArr[0]);
	printf("%p\n",pfunArr);
	printf("%p\n",ppfunArr);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/lw__sunshine/article/details/79663248
今日推荐