一、字符指针变量理解字符指针指向字符串意思是**“指针变量里存的是字符串第一个字符的地址”。你可以通过这个地址找到整个字符串但指针本身并不包含字符串内容**。intmain(){char*pabcde;printf(%c\n,*p);printf(%s,p);return0;}注意到由于指针变量里储存的是第一个字符的地址所以用%c打印解引用的p得到的是a。而%s的运行机制是给一个地址便逐个字节打印得到“\0后才停止所以会完整打印一个字符串。为了程序的安全性由于这里的字符串被存放在只读区不可以被修改所以最好在字符指针变量前加上const。再简单提及《剑指offer》中一道与字符串相关的笔试题1、两个内容相同字符串相同的字符数组并不相同。2、两个内容相同字符串相同的字符指针变量相同。对于字符数组两个数组比如arr1、arr2是单独创建的只是碰巧内容相同本质上还是两个无关的数组所以是不相同的要是相同就是同一个数组了。对于字符指针变量由于内容是相同的所以内容在空间中占用的地址相同字符指针变量也是相同的。字符指针数组intmain(){char*p[3]{zhangsan,wangwu,lisi};inti0;for(i0;i3;i){printf(%s\n,p[i]);}return0;}二、数组指针变量数组指针是指向数组的指针存放的应该是数组的地址。首先如何初始化intmain(){intarr[5]{1,2,3,4,5};int(*p)[5]arr;//*p说明是一个指针指向由5个元素组成的数组数组每个元素是int类型return0;}三、二维数组传参的本质上述提到的数组指针应在二维数组传参时进行使用voidprint(int(*arr)[2],intc,intn){inti0;intj0;for(i0;ic;i){for(j0;jn;j){printf(%d ,*(*(arri)j));}printf(\n);}}intmain(){intarr[3][2]{{1,2},{2,3},{3,4}};print(arr,3,2);return0;}二维数组传参本质传递第一个一维数组的地址。四、函数指针变量指向函数的指针变量存放的是函数的地址。对于函数来说函数名和取地址函数名都是函数的地址。如何初始化intadd(intx,inty){return(xy);}intmain(){int(*p)(int,int)add;//包含指针变量参数个数和类型返回值的类型return0;}另外需要注意仅限于函数指针解引用的时候可以不用加”“甚至加多个”“。下面是函数指针变量相关的两段有趣的代码1intmain(){void(*signal(int,void(*)(int)))(int);return0;}上面的代码是一个函数声明。函数名为signal参数类型分别是一个整型和一个函数指针函数的返回类型也是一个指针变量。2intmain(){(*(void(*)())0)();return0;}从0处为突破口去分析这串代码0被强制类型转换成了函数指针类型再解引用其实是调用了0地址处的一个函数。下面介绍typedef关键字typedef关键字是用来重命名的可以简化代码表达式。比如觉得unsigned int写起来不方便typedefunsignedintunit;//将其重命名为unit对于指针类型可以typedefint*pr_i;int*p1NULL,p2NULL;//这样写p1是指针变量p2是整型变量int*p1NULL,*p2NULL;//这样写才得到两个指针变量pr_i p1NULL,p2NULL;//这样和第二个写法有相同效果return0;需要注意#definepr_tint*//这种写法会把pr_t替换成int*和上述第一种写法效果相同。但是对于数组指针和函数指针类型不太一样重命名的名字都需要写在括号中typedefint(*pr_arr)[5];//数组指针typedefvoid(*pr_a)(int);//函数指针有了这个关键字有趣代码1就可以得到简化void(*signal(int,void(*)(int)))(int);//简化typedefvoid(*pf_t)(int);pf_tsignal(int,pf_t);五、函数指针数组初始化#define_CRT_SECURE_NO_WARNINGS#includestdio.hintadd1(intx,inty){return(xy);}intadd2(intx,inty){return(x-y);}intadd3(intx,inty){return(x*y);}intmain(){int(*ADD[3])(intx,inty){add1,add2,add3};//初始化//这里需要理解。ADD靠近[],所以是一个元素为指针的数组指针指向的是外层的函数。return0;}对于函数指针数组要注意读取顺序去理解。函数指针数组可以作为转移表简化代码。当多个函数的参数类型和返回类型相同时才可运用。用下面的简易计算器举例。intadd1(intx,inty){return(xy);}intadd2(intx,inty){return(x-y);}intadd3(intx,inty){return(x*y);}intadd4(intx,inty){return(x/y);}voidmenu(){printf(---------------------------------\n);printf(---------1,加 2减-------\n);printf(---------3乘 4除-------\n);printf(-------------0退出-------------\n);printf(---------------------------------\n);}intmain(){intinput0;intx0;inty0;intr0;int(*ADD[4])(intx,inty){NULL,add1,add2,add3};//函数指针数组初始化制作转移表//注意可以制作转移表的前提函数的参数类型和返回类型都是相同的do{menu();printf(请输入\n);scanf(%d,input);if(input1input4){printf(请输入两个整数);scanf(%d%d,x,y);rADD[input](x,y);printf(结果为%d,r);}elseif(input0){printf(退出计算器);}else{printf(输入错误请重新输入);}}while(input);return0;}