一、字符指针变量
在指针的类型中我们知道有一种指针类型为字符指针char*
int main() { char ch = 'w'; char *pc = &ch; *pc = 'w'; return 0; }二、数组指针变量
2.1 数组指针变量
//数组指针变量 int (*p)[10]; //p先和*结合,说明p是⼀个指针变量,然后指针指向的是⼀个⼤⼩为10个整型的数组。所以p是 ⼀个指针,指向⼀个数组,叫数组指针。 这⾥要注意:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。2.2 数组指针变量初始化
int arr[10] = {0}; &arr;//得到的就是数组的地址 int(*p)[10] = &arr;int (*p) [10] = &arr; | | | | | | | | p指向数组的元素个数 | p是数组指针变量名 p指向的数组的元素类型三、二维数组传参本质
//二维数组传参 void test(int a[3][5], int r, int c) { int i = 0; int j = 0; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { printf("%d ", a[i][j]); } printf("\n"); } } int main() { int arr[3][5] = { { 1,2,3,4,5 }, { 2,3,4,5,6 }, { 3,4,5,6,7 } }; test(arr, 3, 5); return 0; }//第一行的一维数组的类型是int[5],所以第一行的地址的类型就是 // 数组指针类型int(*p)[5],那就意味着二维数组传参本质上也是 // 传递了地址,传递的是第一行这个一维数组的地址 //*(*(p+i)+j)则是依次从第一行开始输出这个二维数组 //二维数组传参,形参的部分可以写成数组,也可以写成指针形式 void test(int(*p)[5], int r, int c) { int i = 0; int j = 0; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } } int main() { int arr[3][5] = { { 1,2,3,4,5 }, { 2,3,4,5,6 }, { 3,4,5,6,7 } }; test(arr, 3, 5); return 0; }四、函数指针变量
4.1 函数指针变量的创建
void test() { printf("hehe\n"); } void (*pf1)() = &test; void (*pf2)()= test; int Add(int x, int y) { return x+y; } int(*pf3)(int, int) = Add; int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的int (*pf3) (int x, int y) | | ------------ | | | | | pf3指向函数的参数类型和个数的交代 | 函数指针变量名 pf3指向函数的返回类型 int (*) (int x, int y) //pf3函数指针变量的类型4.2 函数指针变量的使用
//函数指针变量的使用 int add(int x, int y) { return x + y; } int main() { int(*pf1)(int, int) = add; printf("%d\n", (*pf1)(2, 3)); printf("%d\n", pf1(2, 3)); return 0; }五、函数指针数组
数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组 int * arr[10]; //数组的每个元素是int*那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢? int (*parr1[3])();六、转移表
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 }; do { printf("********************\n"); printf("1.add 2.sub\n"); printf("3.mul 4.div\n"); printf("0.exit \n"); printf("********************\n"); printf("请选择:"); scanf_s("%d", &input); if ((input <= 4 && input >= 1)) { printf("输入操作数:"); scanf_s("%d %d", &x, &y); ret = (*p[input])(x, y); printf("ret=%d\n", ret); } else if (input == 0) { printf("退出计算器\n"); } else { printf("输入有误\n"); } } while (input); return 0; }