C 指针和后缀的问题

C 指针和后缀的问题,c,arrays,pointers,array-indexing,C,Arrays,Pointers,Array Indexing,所以我必须找出为什么要打印出特定的值,我已经解决了大部分问题,但最后三个问题 我很乐意得到任何帮助 int main(void) { int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; mess(&myValues[3]); //starts function mess } void mess(int *n) { printf("mess :%d\n", *n++); //prints value of

所以我必须找出为什么要打印出特定的值,我已经解决了大部分问题,但最后三个问题

我很乐意得到任何帮助

int main(void)
{
    int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
    mess(&myValues[3]); //starts function mess
}

void mess(int *n)
{
    printf("mess :%d\n", *n++); //prints value of 3rd index (1) and sets pointer to fourth index
    printf("mess: %d\n", *++n); //sets n to 5th index and prints its value
    printf("mess: %d\n", -2[n]); //value: -3
    printf("mess: %d\n", (-2)[n]); //value: 1
    printf("mess: %d\n", n[-6]); //value: 32766
}
我只是不明白-3、1和32766的值是怎么来的

printf("mess: %d\n", -2[n]); //value: -3
-2[n]
-(n[2])
(有关此怪癖的解释,请参阅)。此时,
n[2]
得到了
3
,因此
-n[2]
就是
-3

printf("mess: %d\n", (-2)[n]); //value: 1
这是
[-2]
,这意味着在您开始的位置的“左侧”有2个,这将导致
1

printf("mess: %d\n", n[-6]); //value: 32766
这将在数组开始之前执行,这是未定义的行为。它可以做任何事情,但很可能它只是通过解释不应该以这种方式访问的内存来打印一些垃圾值


我不确定代码的其他语句定义得有多好。这是非常糟糕的做法,请不要这样编写代码。正如您恰当地指出的,这是一团乱麻。首先,在执行前两条
printf()
语句之后,让我们设想一下
n
指向的内存:

int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
                                      ^
                                   // n
让我们逐一看看

  • 语句1:
    printf(“混乱:%d\n”,-2[n])//值:-3

    <代码>-2[n]被解析为
    -(2[n])
    。因此,
    -
    是符号,
    2[n]
    n[2]
    相同,后者是值
    3
    。因此,该声明与

    printf("mess: %d\n", -(n[2]) );       
    
    可视化:

  • 语句2:
    printf(“混乱:%d\n”,(-2)[n])//值:1

    这里,
    n[-2]
    *(n-2)
    相同。结果是该索引处的值。(检查上述可视化)

    可视化:

  • 最后,语句3:
    printf(“混乱:%d\n”,n[-6])//值:32766

    根据指针
    n
    的当前内容,最不可访问的索引是
    -5
    ,尝试访问索引
    -6
    处的内存位置是访问越界,原因如下。结果是不合理的

    可视化:


首先,请记住,在C中,数组索引是可交换的-
a[i]
i[a]
产生相同的结果

那么,线路呢

printf("mess: %d\n", -2[n]); //value: -3
相当于写作

printf( "mess: %d\n", -n[2] );
后缀
[]
运算符的优先级高于一元
-
运算符,因此表达式
-2[n]
被解析为
-(2[n])
。您正在为
n
(3)中的2个元素编制索引,并对结果求反

在下面的行中

printf("mess: %d\n", (-2)[n]); //value: 1
表达式
(-2)[n]
相当于
n[-2]
-您在
n
之前索引了2个元素,这将为您提供1

排队

printf("mess: %d\n", n[-6]); //value: 32766

您试图在
n
之前索引6个元素;不幸的是,这超出了数组的范围。此时行为尚未定义。你可能会得到垃圾输出,你的代码崩溃,或者发生其他事情

这个代码来自哪里?逃跑。
a[n]
*(a+n)
相同。填空,你就会得到结果。@EugeneSh。我们在实践中学习。没什么好害怕的。@nicomp我害怕学校给学生做的练习教错了东西。这不是我的代码,只是我们教授的一些代码。看看我们对这门学科的理论理解有多深。。。。但还是要感谢你的回答,你的回答帮助很大!谢谢。让它变得更加难以接受
printf( "mess: %d\n", -n[2] );
printf("mess: %d\n", (-2)[n]); //value: 1
printf("mess: %d\n", n[-6]); //value: 32766