注意:数组元素中的"[]"是变址运算符,相当于*(+).

对于一维数组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了!