一、指针数组
指针数组是数组,这个数组里面存放的是指针。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
char *pch[6] = { "妹", "妹", "你", "坐", "船", "头" };
for (i = 0; i<6; i++){
printf("%s ", pch[i]);
}
printf("\n");
system("pause");
return 0;
}
二、数组指针
数组指针是指针,这个指针指向一个数组,指针存放数组的地址。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char c[][4] = { "哥", "哥", "我", "岸", "上", "走" };
char(*p)[4];
int i;
p = c; //将指针定位于c[0]
for (i = 0; i <= 5; i++)
{
printf("%s, ", *(p + i)); //或者将*(p+i)替换成*p++
}
printf("\n");
system("pause");
return 0;
}
三、函数指针
函数指针是指针,指针变量存放函数的入口地址。与用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。函数指针有两个用途:调用函数和做函数的参数。
#include<stdio.h>
#include<stdlib.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test); //输出结果相同
system("pause");
return 0;
}
四、函数指针数组
函数指针数组就是数组,只不过这个数组存放的是函数指针而已。可以用来代替switch case语句。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
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 my_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, my_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);
}
system("pause");
return 0;
}
五、指向函数指针数组的指针
指向函数指针数组的指针还是指针,这个指针指向一个数组,而这个数组的元素是函数指针。
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
// 函数指针 pfun
void (*pfun)(const char*) = test;
// 函数指针的数组 pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
// 指向函数指针数组 pfunArr 的指针 ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}