高级指针——数组指针,函数指针,函数指针数组,指向函数指针数组的指针

字符指针

#include<stdio.h> 

int main()
{   //一般用法 
    char ch='a';
    char *p=&ch;
    
    //p字符指针指向字符串
    char *p="abcdef";
    //p中存放的是字符a的地址 
    printf("%c\n",*p);  a
	printf("%s",p);     abcdef
	
} 

指针数组

指针数组是数组,是存放指针的数组

int main()
{   
    int *arr[10]; //整形指针数组
     
} 

数组指针

指向数组的指针

#include<stdio.h> 

int main()
{   
    int arr[10]={0};
    int (*pa)[10]=&arr;//&arr是整个数组的地址  arr是数组首元素的地址
	 //*pa用括号括起来,说明pa首先是一个指针,【10】代表指针指向数组的,数组有10个元素,
	 //前面再来个 int ,代表数组内元素类型是整形的
	 
	 char ch[5];
	 char (*p)[5]=&ch; 
	  
} 

*pa用括号括起来,说明pa首先是一个指针,【10】代表指针指向数组的,数组有10个元素,前面的int ,代表数组内元素类型是整形

函数指针

指向函数的指针

#include<stdio.h>
int add(int x,int y)
{
	return x+y;
}

int main()
{
	
	int (*p)(int ,int )=&add;//或写成 int (*p)(int ,int )=add; 
	//第一个int代表返回值为整形类型,第二个括号代表为函数的指针
	//括号内为形参的类型
	int ret =(*p)(2,3);//(*p)(2,3)相对于add(2,3)
	//也可以写成  (p)(2,3)  或  P(2,3)     
    printf("%d",ret); 
	
 } 

1.&add和add同样代表函数的地址
2.对函数解引用的时候可以不加*,直接用指针变量

函数指针数组

#include<stdio.h>
int add(int x,int y)
{
	return x+y;
}
int sub(int x,int y)
{
	return x-y;
}
int main()
{
	
	int (*p1)(int ,int )=add; 
    int (*p2)(int ,int)=sub;
	int(*parr[2])(int ,int )={add,sub};
	//函数指针数组只需在函数指针的变量后面加上[n] 
    printf("%d",ret); 
	
 } 

函数指针数组的应用——简单计算器

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
//计算器——加、减、乘、除
void menu()
{
	printf("**************************\n");
	printf("*******1.add  2.sub*******\n");
	printf("*******3.mul  4.div*******\n");
	printf("*******0.exit       ******\n");
	printf("**************************\n");

}

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;
}

int main()
{
	int input = 0;
	int x = 0, y = 0;
	int ret = 0;
	int(*p[])(int, int) = {0, add, sub, mul, div};
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出程序");
			break;
		}
		else if (input >= 1 && input <= 4)
		{

			printf("请输入两个操作数");
			scanf("%d%d", &x, &y);
			ret = p[input](x, y);
			printf("ret=%d\n", ret);
		}
		else
			printf("输入错误,请重新输入");

	} while (input);
	return 0;
}

指向函数指针数组的指针

#include<stdio.h>


int main()
{
	int(*p)(int ,int)  //函数指针
	int(*parr[])(int ,int ) //函数指针数组
	int(*(*pparr)[4])(int ,int )=&parr;//pparr是指向函数指针数组的指针 
	
	
}

回调函数

#include<stdio.h>
void test1()
{
	printf("hehe");
	
}
void test2(void (*p)())
{
	p();
}

int main()
{
	test2(test1); 
	return 0;
}

没有直接调用test1函数,而是将其地址传到test2函数中,再调用

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不可触碰的殇

前途似海,来日方长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值