对于指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针的简单理解
指针是c语言的精华,相当重要。
1. 指针数组
首先他是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
举个栗子
int *p1[10] ; //指针所指向的类型是int
char * p; //指针所指向的类型是char
int ** p3; //指针所指向的类型是int*(也就是一个int*型指针)
“[ ]”的优先级比 ” * “要高。p1先与 “[]”结合,构成一个数组的定义,数组名为p1,int * 修饰的是数组的内容,即数组的每个元素。我们可以借助下面的图加深理解:
2.数组指针
首先它是一个指针,它指向一个数组。在32位系统下永远是占4个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
int (*p2)[3]; //指针所指向的类型是int()[3],二维指针的声明
在这里”()”的优先级比“[]”高,”*” 号和p2构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素,
3.函数指针
函数指针是指向函数的指针变量。因此“函数指针”本身首先应该是指针变量,只不过指针变量指向函数。函数指针有两个用途:调用函数和做函数的参数。
例如
int func(int x); //声明一个函数
int (*f)(int x); //声明一个函数指针
f = &func; //将func函数的首地址赋给指针f
首先看一段代码:
#include<stdio.h>
#include<stdlib.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n",test);
printf("%p\n",&test);
system("pause");
return 0;
}
输出的结果
输出的是两个地址,这两个地址是test函数的地址。
下面我们可以将函数的地址保存起来,首先,能给存储地址就要是一个指针
请看代码
void test()
{
printf("hehe\n");
}
void (*pfun)(); //pfun先和*结合,说明pfun是指针,指针指向的是一个函数,
指向的函数无参数,返回值类型为void
4.函数指针数组
有一个数组,用来盛放函数指针,就是函数指针数组。
直接上代码
int (*parr[10])();
parr先和[]结合,说明parr是数组,数组的内容是int(*)()类型的函数指针。
请继续看
void (*func[3])(int x); //函数指针数组
void (*func)(int x); //函数指针
两个放在一起对比,函数指针数组无非就像数组声明一样,在后面加了[]而已。
简直就和普通的数组一模一样,没错,无非它存储的是函数指针而已。
举个栗子(计算器)
#include<stdio.h>
#include<stdlib.h>
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int dv(int a,int b)
{
return a/b;
}
int main()
{
int x,y;
int input=1;
int ret = 0;
int (*p[5])(int x,int y)={0,add,sub,mul,dv};
while(input)
{
printf("**************************************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("**************************************\n");
printf("请选择:");
scanf("%d",&input);
if(input<5 && input>0)
{
printf("请输入操作数 :");
scanf("%d %d",&x,&y);
ret = (*p[input])(x,y);
}
else
printf("输入有误\n");
printf("ret = %d\n",ret);
}
system("pause");
return 0;
}
5.指向函数指针数组的指针
指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针
定义 void ( * (*fun)[3])(int,int);
这个指针指向一个包含了3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为void的指针、参数为整形的函数。
其实也好理解,这里的函数指针数组指针不就是一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针,仅此而已