c语言指针运算,指针转换格式优先级

printf("%s\n", *cpp[-2] + 3),
我的理解:cpp是三级指针,此时指向的是二级指针首地址,解引用后是 c+3,然后再+3
看别人的他是把 *cpp[-2] 转换为 * *(cpp-2)+3),他的这个我能理解,cpp-2指向二级指针首地址,然后解引用后得到一级指针地址,再解引用后得到一级指针里的"FIRST",
想问这个是怎么转换的?又怎么理解?

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);//怎么理解?* *(cpp-2)+3)
    printf("%s\n", cpp[-1][-1] + 1);

    return 0;
}

你确认这代码可以运行?

img

【以下回答由 GPT 生成】

这段代码中,cpp是一个指向二级指针数组cp的指针。cp是一个二级指针数组,其中包含四个元素,每个元素都指向c数组中的一个字符串。下面我们来逐行解析代码:

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

这行代码的目的是输出c[2],即字符串"POINT"。cpp首先被递增,指向了cp的第二个元素,即c+1。然后两次解引用操作**将指针操作转换为了字符串,最终输出了c+1对应的字符串"POINT"。

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

这行代码的目的是输出c[0],即字符串"ENTER"后的3个字符。cpp首先被递增,指向了cp的第三个元素,即c+3。然后递减操作--将指针操作转换回了c+2,再解引用操作*得到c+2对应的字符串"NEW"。最后,3被加到了字符串的指针上,输出了"WER"。

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

这行代码的目的是输出c[3],即字符串"FIRST"后的3个字符。cpp递减2个单位,指向了cp的第一个元素,即c。然后两次解引用操作**将指针操作转换为了字符串,最终输出了c对应的字符串"FIRST"。

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

这行代码的目的是输出c[2],即字符串"POINT"后的1个字符。cpp[-1]表示cp的第三个元素,即c+2;再次索引[-1]即得到了c+2对应的字符串"POINT"。最后,1被加到了字符串的指针上,输出了字母"O"。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^