简单理解—指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
程序员文章站
2024-01-29 19:32:28
...
简单理解—指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
指针数组
指针数组,顾名思义是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。
举个例子:
char *str[4] = {"hello", "world", "work", "hard"};
//str就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址
为什么这样定义呢?
这里就需要对优先级有一定的了解,因为 [] 的优先级高于 * ,所以 str 先与 [] 结合,表示这是一个数组变量,有四个元素。之后我们可以将 str[4] 去掉,就剩下了 char * ,表示这个数组中存放的是char * 类型的指针
数组指针
数组指针,顾名思义是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
举个例子:
char *str[4] = {"hello", "world", "work", "hard"};
char *(*pstr)[4] = str;
//pstr就是我定义的一个数组指针,它存放着数组str的地址
//str数组有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址
为什么这样定义呢?
因为 [] 的优先级高于 * ,所以需要加上()来保证 pstr 先与 * 结合,表示这是一个指针变量,它存放着数组str的地址。之后我们可以将 * pstr 去掉,就剩下了 char * [4] ,表示这个指针指向的是一个数组,这个数组里面存放了四个char * 类型的指针
函数指针
函数指针,顾名思义是”函数的指针”,也就是指向函数地址的一个指针变量
举个例子:
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1;
int b = 2;
int (*pfun)(int,int) = Add(a, b);
//Add是一个简单的加法函数
//pfun就是我定义的一个函数指针,它存放着函数Add的地址
printf("%d\n", pfun);
return 0;
}
为什么这样定义呢?
同样的,因为 () 的优先级高于 * ,所以需要加上()来保证 pfun 先与 * 结合,表示这是一个指针变量,它存放着函数Add的地址。之后我们可以将 * pfun 去掉,就剩下了 int () ,表示这个指针指向的是一个函数,这个函数有两个int型参数,它的返回值为int类型。
函数指针数组
函数指针,顾名思义是”函数指针的数组”,也就是一个用来存放函数指针的数组
函数指针的用途:转移表
举个例子:(计算器)
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
if (y == 0)
{
return 'F';
}
else
{
return x / y;
}
}
int main()
{
int a = 0;
int b = 0;
int input = 1;
char ret = 0;
int(*p[5])(int a, int b) = { 0, Add, Sub, Mul, Div };
//
//转移表
//p就是我定义的一个函数指针数组,它有五个元素,每个元素是一个函数指针,这些指针存放着其对应函数的地址
while (input)
{
printf("**********************************\n");
printf("***** 1.Add 2.Sub *****\n");
printf("***** 3.Mul 4.Div *****\n");
printf("***** 0.Quit *****\n");
printf("**********************************\n");
printf("\n请选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
begin:
printf("\n请输入操作数:");
scanf("%d %d", &a, &b);
ret = p[input](a, b);
if (ret == 'F')
{
printf("\n输入有误,请重新输入\n");
goto begin;
}
else
{
printf("\nret = %d\n\n", ret);
}
}
else if (input == 0)
{
printf("\n退出\n\n");
}
else
{
printf("\n选择错误\n\n");
}
}
return 0;
}
指向函数指针数组的指针
如何定义?
void test(int x)
{
printf("hehe\n");
}
int main()
{
//函数指针pfun
void(*pfun)(int) = test;
//函数指针数组pfunarr
void(*pfunarr[5])(int);
pfunarr[0] = test;
//指向函数指针数组pfunarr的指针ppfunarr
void(*(*ppfunarr)[10])(int) = &pfunarr;
return 0;
}