指针的深入理解

一、指针数组

含义它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是储存指针的数组的简称。 

 如:int * p1[8];这是一个数组,其包含8 个指向int 类型数据的指针,即指针数组。int *修饰数组的元素。

二、数组指针

含义:它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节, 不能直接得出它指向的数组占多少字节。它       是指向数组的指针的简称。

比如:int (*p2)[10];p2 是一个指针,它指向一个包含10 int 类型数据的数组,即数组指针。int 修饰数组的内容。

使用举例:int(*p)[10];p先和*结合,说明p是一个指针变量,然后接着指向的是一个大小为10个整形的数组。所以p是一个指针,指向一个数组,叫数组指针。

void print(int(*arr)[5];//二维数组传参

值得注意的是:[]的优先级要高于*号的,所以必须不加上()来保证P先和*结合。p的类型由p两侧符号的优先级决定。

三、函数指针

含义:函数指针就是函数的指针。它是一个指针,指向一个函数。

比如:void (*pfun1)();pfun是一个指针变量,它指向一个函数,这个函数没有参数,函数的返回值为一个空类。

使用举例:下面pfun1和pfun2哪个有能力存放test函数的地址?!

                 void ( * pfun1 )( )     void *pfun2( )

答案肯定是pfun1,。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。       下面阅读两个有趣的代码:

代码1)( * ( void ( * ) ( ) ) 0 ) ( )

分析:这是一个函数调用,把0强制转换为函数指针类型,把0号地址里连续的4个字节的的内容拿出来,返回值为void。

代码2) void ( * signal ( int ,void ( * ) ( int ) ) ) ( int );

分析:将代码2)进行简化:typedef  void ( *pfun_t )( int )

                                           pfun_t   signal ( int, pfun_t )

signal是个函数,参数分别为括号中的int和void(*)(int),返回值为void*int。括号中的void(*)(int)是个函数指针,返回值为void*int。

四、函数指针数组

含义:把函数的地址存到一个数组中,那这个数组就叫函数指针数组。

 比如:char * (*pf[3])(char *p);它是一个数组,数组名为pf,数组内存储了3 个指向函数的指针。这些指针指向一些返      回值类型为指向字符的指针、参数为一个指向字符的指针的函数。

函数指针的用途:转移表

例子:(计算器)

#include<stdio.h>
#include<windows.h>
#pragma warning (disable:4996)
int my_add(int x, int y)
{
	return x + y;
}
int my_sub(int x, int y)
{
	return x - y;
}
int my_mul(int x, int y)
{
	return x*y;
}
int my_div(int x, int y)
{
	if (y == 0)
	{
		printf("div zero!error!\n");
		return -1;
	}
	return x / y;
}
void menu()
{
	printf("************************\n");
	printf("***1.add        2.sub***\n");
	printf("***3.mul        4.div***\n");
	printf("***             0.quit***\n");
	printf("************************\n");
	printf("Please select: ");
}
int main()
{
	int(*p[4])(int, int) = { my_add, my_sub, my_mul, my_div };
	int select;
	do{
		menu();
		scanf("%d", &select);
		if (select >= 1 && select <= 4)
		{
			int x;
			int y;
			printf("Please Enter Your Data For Cal<x,y>: ");
			scanf("%d%d", &x, &y);
			int res = p[select - 1](x, y);//函数调用,p是数组
			printf("Result:%d\n", res);
		}
		else if (select == 0)
		{
			printf("over!\n");
			break;
		}
		else
		{
			printf("You Enter Select Error[1,4]\n");
		}
	} while (1);
	system("pause");
	return 0;
}

显示结果:



五、指向函数指针数组的指针

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

比如:char * ((*pf)[3])(char p); pf 是指针。这个指针指向一个包含了3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。

使用举例:

void test(const char *str)
{
	printf("%s\n", str);
}
int main()
{
	void(*pfun)(const char*)=test;//函数指针pfun
	void(*pfunArr[5])(const char*str);//函数指针的数组pfunArr
	pfunArr[0] = test;
	void(*(*ppfunArr)[10])(const char*);//指向函数指针数组pfunArr的指针ppfunArr
	return 0;
}


猜你喜欢

转载自blog.csdn.net/zy_20181010/article/details/80423384