一、字符指针变量在指针的类型中我们知道有一种指针类型为字符指针char*int main() { char ch w; char *pc ch; *pc w; return 0; }二、数组指针变量2.1 数组指针变量整形指针变量int * pint;存放的是整形变量的地址能够指向整形数据的指针。浮点型指针变量float * pf;存放浮点型变量的地址能够指向浮点型数据的指针。那数组指针变量应该是存放的应该是数组的地址能够指向数组的指针变量。//数组指针变量 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]那就意味着二维数组传参本质上也是 // 传递了地址传递的是第一行这个一维数组的地址 //**pij则是依次从第一行开始输出这个二维数组 //二维数组传参形参的部分可以写成数组也可以写成指针形式 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 xy; } 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])();parr1先和[ ]结合说明 parr1是数组数组的内容是是 int (*)()类型的函数指针。六、转移表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; }