C 输出不匹配

C 输出不匹配,c,pointers,C,Pointers,下面的代码将输出为AVA,但我不明白为什么?在我看来,输出应该是代码> + +>代码>,因为作为C=B,它指向的是存储在 A+ 2、A+1、A+3、A/COD>的字符串,而在代码> ++C之后,它将从 A+1 < /C> >开始,这是C++。但它指向JAVA #include <stdio.h> int main() { char * A[] = {"C", "C++", "JAVA", "PHP"}; char **B[] = {A+2, A+1, A+3, A}, *

下面的代码将输出为
AVA
,但我不明白为什么?在我看来,输出应该是代码> + +>代码>,因为作为C=B,它指向的是存储在<代码> A+ 2、A+1、A+3、A/COD>的字符串,而在代码> ++C<代码>之后,它将从<代码> A+1 < /C> >开始,这是C++。但它指向
JAVA

#include <stdio.h>
int main() {
   char * A[] = {"C", "C++", "JAVA", "PHP"};
   char **B[] = {A+2, A+1, A+3, A}, ***C;
   C = B;
   ++C;
   printf("%s", *(*C+1)+1);
}
#包括
int main(){
char*A[]={“C”,“C++”,“JAVA”,“PHP”};
字符**B[]={A+2,A+1,A+3,A},***C;
C=B;
++C;
printf(“%s”,*(*C+1)+1);
}

请帮忙。

让我们把它分解一下。。。你有
*(*C+1)+1
。让我们先找出C的值,然后进行研究:

  • C=B

    B的数组类型被省略为a
    char***
    ,C现在指向B的第一个元素

  • ++C

    C增加1,现在指向B的第二个元素

  • 评估
    (*C+1)

    *C
    相当于
    B[1]
    并为您提供指针
    A+1
    。您向它添加1,因此
    (*C+1)
    相当于
    A+2

  • 评估
    *(*C+1)+1

    根据上面的解释,这现在相当于
    *(A+2)+1
    ,即
    A[2]+1
    。指向字符串“AVA”


  • 最后,关于风格的注意事项:永远不要这样写代码

    让我们把它分解一下。。。你有
    *(*C+1)+1
    。让我们先找出C的值,然后进行研究:

  • C=B

    B的数组类型被省略为a
    char***
    ,C现在指向B的第一个元素

  • ++C

    C增加1,现在指向B的第二个元素

  • 评估
    (*C+1)

    *C
    相当于
    B[1]
    并为您提供指针
    A+1
    。您向它添加1,因此
    (*C+1)
    相当于
    A+2

  • 评估
    *(*C+1)+1

    根据上面的解释,这现在相当于
    *(A+2)+1
    ,即
    A[2]+1
    。指向字符串“AVA”

  • 最后,关于风格的注意事项:永远不要这样写代码