目录
1.二级指针
二级指针也是指针,是指针就是用来存放地址的,那么它存放的是谁的地址呢?
二级指针存放的就是一级指针的地址,有几个 * 我们就成它为几级指针。
对二级进行指针运算:
2.指针数组
指针数组:用来存放指针的数组
2.1指针数组模拟二维数组
int main() {
int arr1[] = { 1,2,3,4 };
int arr2[] = { 2,3,4,5 };
int arr3[] = { 3,4,5,6 };
//数组名是数组⾸元素的地址,类型是int*,可以存放在parr数组中
int* parr[3] = { arr1, arr2, arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
———————————————————————————————————————————
指针数组在内存中的情况
——————————————————————————————————————————
程序运行时的情况
3.函数指针变量
顾名思义就是,函数的指针。函数指针里存放的是函数的地址,可以在我们使用时进行调用。
函数的地址
有的人会说函数也有地址吗?
答案是肯定的,下面我们看一段代码
可以看见函数其实也是有地址的
并且&数组名,与数组名,都是函数的地址,没有任何区别
函数指针变量的创建
函数指针变量的调用
void test() {
printf("haha\n");
}
int main() {
void (*p1)() = &test;
void (*p2)() = test;
test(); //实际上test里存的就是函数的地址
(*p1)(1,2); //我们通过对p1解引用也可以找到函数的地址,一样调用
p2(1, 2); //*是可以省略的,因为我们p2存放的就是函数的地址,与第一种调用没差
return 0;
}
4.函数指针数组
数组是一个存放相同元素的粗存空间,当让也就可以存放函数指针
函数指针数组,就是用来存放函数指针的数组
函数指针数组的创建
int main() {
int (*parr1[3])(); //parr1 先和 [] 结合,说明 parr1是数组
//数组的内容是int (*)() 类型的函数指针。
return 0;
}
4.1使用函数指针数组做简易计算器
有人可能会有疑惑,说感觉这函数指针数组也没什么用,是不是搞出来唬人的东西
然而,非也函数指针数组可以帮助我们解决代码冗余等问题
简单计算器
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 div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" 0:exit \n");
printf("*************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
可以看出代码非常的冗余
使用函数指针数组完成简易计算器
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) {
return x / y;
}
void calc(int (*p)(int, int), int input) { //设置转移表
int ret = 0;
int x, y;
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = (*p)(x, y);
printf("ret = %d\n", ret);
}
int main() {
int input = 1;
int(*p[5])(int x, int y) = { 0,add,sub,mul,div };//创建函数指针数组
do {
printf("------1.add 2.sub---------\n");
printf("------3.mul 4.div---------\n");
printf("------0.exit ---------\n");
printf("请选则");
scanf("%d", &input);
if ((4 >= input) && (input >= 1))
{
calc(p[input], input); //通过输入的input来决定使用的函数
}
else if (input == 0) {
printf("退出计算器\n");
}
else
{
printf("输入有误\n");
}
} while (input);
return 0;
}
代码非常的简洁