- 字符指针
- 数组指针
- 指针数组
- 函数指针
- 函数指针数组
- 指向函数指针数组的指针
字符指针
1.获得字符串变量的地址
int main()
{
char ch = 'a';
char *p = &ch;
return 0;
}
2.将一个字符串的首字符地址放到指针中
int main()
{
char *ch = "hello world";
printf("%s\n", ch);
return 0;
}
//它的效果:调用这个字符指针可以获取里面的内容
但是他的存储是将字符串的首字符地址放入字符指针
数组指针
int (*p)[10]; //指向数组的指针(本质上还是一个指针)
这个指针指向的是一个数组
(可以理解成与字符指针不同是指向的类型不一样)
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int (*p)[10] = &arr;
return 0;
}
指针数组
int *p[10]; //与数组指针相类似
主要是因为[] 的优先级 高于 * 的优先级
p先与[]结合 成为一个数组 存放内容为 int *
函数指针
void (*test) () //与数组指针相类似
()的优先级比 *的优先级高
函数指针数组
一个数组,存放函数指针
int (*test[10])();
与指针数组类似
int test[10];
在他的基础上成为一个函数,由于优先级低于()
所以在整体加括号
实战中,可以通过数组对函数实行调用
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;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input <= 4 && input >= 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
指向函数指针数组的指针
指向 函数指针数组 的指针
函数指针数组 void (*test[10]) ();
数组指针 int (test)[10]
指向函数指针数组的指针 void ((*test[10]))()