#include <stdio.h>

int main() {
 
    static char*s[]  = {"6642321","93456","134098","55513"};
    char ** str[] = {s+3,s+2,s+1,s};
    char ***p = str;
    **++p;
    printf("%s\n",*--*++p+2);
    return 0;
}

在这段代码中,printf语句*++p给出一个地址(S+1).在我的理解中,--(s+1)给出了编译错误.但此代码给出的输出为42321.为什么我会得到这样的答案.有谁能解释一下这个代码吗?

推荐答案

**++p;年中:

  • ++p递增p,因此它指向str+1,而不是其初始值str.
  • 第二个*产生元素p指向(在增量之后),即str[1].
  • *生成str[1]所指向的元素,即*(s+2)s[2].
  • 然后这个值被丢弃,因为表达式不对它做任何事情.

printf*--*++p+2名中:

  • ++p递增p,因此它指向str+2.
  • 第二个*产生指向的元素p,即str[2].
  • --减go str[2],所以它从s+1变为s+0,或者说s.
  • 第一个*产生指向(减量后)的元素str[2],因此它产生*s或等价地产生s[0].s[0]是指向"6642321"的第一个字符的指针.
  • +2产生一个指针,指向两个字符,所以它指向4字符.

然后,这个指向4字符的指针被传递给printf.从该点开始的字符是42321和一个空字符,因此printf打印42321.

C++相关问答推荐

当包含头文件时,gcc会发出隐式函数声明警告

C中空终止符后面的数字?

sizeof结果是否依赖于字符串的声明?

exit(EXIT_FAILURE):Tcl C API类似功能

在一个小型玩具项目中实现终端历史记录功能

带有sigLongjMP中断I/O的异常处理程序

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

Flose()在Docker容器中抛出段错误

解决S随机内存分配问题,实现跨进程高效数据共享

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

正数之和是负数

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

如何在不使用字符串的情况下在c中编写函数atof().h>;

为四维数组中的Dim-1和Dim-3重新分配空间

如何使用空元素块声明指针数组

按字典顺序打印具有给定字符的所有可能字符串

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

将数组中的所有元素初始化为 struct 中的相同值

添加/删除链表中的第一个元素

如何在C中以0x格式打印十六进制值