注意:数组元素中的"[]"是变址运算符,相当于*(+).
对于一维数组b,b[j]相当于*(b+j).
对于二维数组元素a[i][j],将分数组名a[i]当做b代入*(b+j)=>*(a[i]+j),再将其中的a[i]换成*(a+i)又得到*(*(a+i)+j)
1、
真题中出现的

举一反三:
1 int main(){ 2 char *s[6]={"BGCD","OFEH","IJKV","ALMN","QXYZ","PRST"}; 3 char **p; 4 int k,j; 5 p=s; 6 for(j=0;j<6;j++){ 7 for(k=1;k<4;k++) 8 printf("%c",(*(p+j))[k]); 9 printf("\n"); 10 } 11 return 0; 12 }
答案:

2、指针函数与函数指针的区别
https://blog.csdn.net/luoyayun361/article/details/80428882
3、
1 #include <iostream>
2
3 #include<stdio.h>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<math.h>
7 #define SLEN 20
8 #define M 50
9 #define N 20
10 #define LEN 12
11
12 void f(int i,char *cp){
13 for(;i;i--)
14 printf("%c",*cp++);
15 }
16
17
18 int main(){
19 char a[][4]={"ABC","DEF","GH"};
20 char *p;
21 p=a[0];
22 f(1,p++);
23 f(1,p++);
24 f(1,p++);
25 printf("\n");
26 p=a[1];
27 f(3,p++);
28 f(2,p++);
29 f(1,p);
30 printf("\n");
31 printf("%s\n",a[0]);
32 return 0;
33 }
运行结果:

这道题也向我们清晰的展示了所谓的形参为指针时,不一定能使得实参改变。
上面在main函数中执行f(1,p++)时,p传递的是p指针所存储的地址值给cp,而函数在执行时是不断的动用cp指针,而指针p除了p++这一次动了,就没动了。
想让p跟着cp变也可以,只要传递指针p所在的空间大的地址值,但是cp应该改为二级指针。
如下:

注意在f()函数中一定是*(*cp)++,括号一定不能少,这是由符号的优先级和结合方向所决定的
首先由于cp是二级指针则心中要明白 *cp<=>p
其次由于*运算符和++运算符是同级的,但是结合方向是自右向左的。
比如:*p++<=>p++ 这个是先运算后加一 所以p++得到表达式的值为p,再*表达式的值即*p.最后再p++;
因此同理为*(*cp)++;
如果不加()写成**cp++,先**cp这个没有错,但是cp加一就不对了!因为cp指向的是p指针,cp再加一,它最后指向的内容就不知道是个啥东西了,可以试试。

至于为啥cp变了,但是p没跟着变?前面我已经说了(*cp)才与p等价,而不是cp,此时变得是cp,即cp已经不指向p了!