指针所指的到底是地址还是内容?
具体例子:
#include<stdio.h>
int main ()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char **cp[] = {c + 3,c + 2,c + 1,c};
char ***cpp[] = cp;
printf ("%s\n",**++cpp); // 输出:POINT
printf ("%s\n",*--*++cpp + 3); // 输出:ER
printf ("%s\n",*cpp[-2] + 3); //ST
printf ("%s\n",cpp[-1][-1] + 1); //EW
}
做这种题目之前,可以先把他们的关系图画出来,这样方便做题,如下图所示。
具体问题具体分析
- 对于**++cpp
++cpp ---->:cpp原本指向第一个位置,++cpp之后指向下一个位置,如下图所示:
*++cpp ----> :++cpp 所指的地址的内容 -----> c+2;
**++cpp ----> :而c+2是POINT的地址,**++cpp指的是c+2地址的内容,即POINT;
2. 对于 *--*++cpp + 3:
++cpp ----> :之前++cpp指的是c+2的地址,现在再往下移动一个,指向c+1的地址。如下图所示:
*++cpp ---> :指的内容即c+1,如下图所示;
*--*++cpp ---> :--*++cpp指的是c+1再减1----> c,*--*++cpp ---> c所指向的地址,如下图所示:
*--*++cpp + 3---> :c所指向的地址为c[0]数组的首元素地址,再+3 ---> output --->ER;
3. 对于*cpp[-2] + 3
*cpp[-2] + 3 = **(cpp + (-2)) + 3
= **(cpp - 2) + 3
**(cpp - 2) ---> :cpp之前指向的位置为c+1的地址,cpp - 2 指向的地址为c+3的地址。由上两个问题可知 **(cpp - 2)---> FIRST
**(cpp - 2)+ 3 ---->:ST。
4. 对于cpp[-1][-1] - 1
注意:此时cpp指向的是c+1的地址。
cpp[-1][-1] - 1 = *(*(cpp + (-1)) - 1) + 1
= *(*(cpp- 1)-1)+ 1
*(*(cpp- 1)-1)+ 1 ----> :EW。