字符指针
#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函数中,再调用