经典指针运算笔试题解析

 #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);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
 }

求打印的内容

目录

初始化:

**++cpp:

*--*++cpp + 3:

*cpp[-2] + 3:

cpp[-1][-1] + 1:


初始化

    char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
    char** cp[] = {c+3, c+2, c+1, c};
    char*** cpp = cp;

c[] 是字符指针数组,包含了四个字符串指针:

  • c[0] -> "ENTER"
  • c[1] -> "NEW"
  • c[2] -> "POINT"
  • c[3] -> "FIRST"

cp[] 是字符指针数组,包含四个元素,指向 c[] 中的不同位置:

  • cp[0] -> c + 3,即 c[3],指向 "FIRST"
  • cp[1] -> c + 2,即 c[2],指向 "POINT"
  • cp[2] -> c + 1,即 c[1],指向 "NEW"
  • cp[3] -> c,即 c[0],指向 "ENTER"
  • cppchar*** 类型,指向 cp[] 数组。

**++cpp

printf("%s\n", **++cpp);

  • 初始时,cpp 指向 cp[0],即 c+3,指向 "FIRST"
  • ++cpp 使 cpp 移动到 cp[1],即 c+2,指向 "POINT"
  • *cpp 解引用后得到 c+2,即指向 "POINT"
  • **cpp 再次解引用得到 "POINT"

所以,printf("%s\n", **++cpp); 输出 "POINT"

*--*++cpp + 3

printf("%s\n", *--*++cpp+3);

  • ++cpp 使 cpp 移动到 cp[2],即 c+1,指向 "NEW"
  • *cpp 解引用得到 c+1,即指向 "NEW"
  • --*cpp 使指针 c+1 向前移动一个位置,指向 c[0],即 "ENTER"
  • *--*cpp 解引用得到 "ENTER"
  • *--*cpp + 3"ENTER" 的指针移动三个字符,指向 "ENTER" 中的第四个字符,即 "ER"

所以,printf("%s\n", *--*++cpp + 3); 输出 "ER"

*cpp[-2] + 3

printf("%s\n", *cpp[-2]+3);

在这里我们先将以上表达式化简一下,方便理解

printf("%s\n", **(cpp - 2) + 3);

  • cpp[-2]cp[0],即 c+3,指向 "FIRST"
  • *cpp[-2] 解引用得到 c+3,即指向 "FIRST"
  • *cpp[-2] + 3 将指针向后移动三个字符,指向 "FIRST" 中的第四个字符,即 "ST".

cpp[-1][-1] + 1

 printf("%s\n", cpp[-1][-1]+1);

我们还是按照惯例化简一下便于理解

 printf("%s\n", *(*(cpp - 1) - 1) + 1);

  • cpp[-1]cp[1],即 c+2,指向 "POINT"
  • cpp[-1][-1]*cpp[-1] 的第一个元素,等同于 *c+2,即指向 "POINT"
  • cpp[-1][-1] + 1"POINT" 的指针移动一个字符,指向 "POINT" 中的第二个字符 "EW".

所以,printf("%s\n", cpp[-1][-1] + 1); 输出 "EW"

//最终输出
POINT
ER
ST
EW

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值