不太理解得数是如何算出来的?尤其是0


#include<stdio.h>
#include<stdlib.h>
int main(void)
{int a[]={1,2,3,4,5};
int *p=a;
printf("%d,",*p);
printf("%d,",*(++p));
printf("%d,",(*p)++);
printf("%d,",*p);
printf("%d,",*p--);
printf("%d,",--(*p));
printf("%d\n",*p);
}

img

printf("%d,",*p); 输出第一个元素,1
printf("%d,",*(++p)); 输出第二个元素,2,此时p指向第二个元素
printf("%d,",(*p)++); 输出第二个元素,2,然后++,此时数组为 13345
printf("%d,",*p); 输出第二个元素,3
printf("%d,",*p--); 输出第二个元素,3,然后再让p指向第一个元素
printf("%d,",--(*p)); 先让第一个元素-1,此时数组为03345,再输出它,0
printf("%d\n",*p); 再次输出第一个元素,0


供参考:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int a[]={1,2,3,4,5};// a[0]=1, a[1]=2, a[2]=3, a[3]=4, a[4]=5
    int *p=a;           // p = &a[0]
    printf("%d,",*p);   // *p ===> a[0] = 1,输出 1,
    printf("%d,",*(++p));// *(++p),(++p)优先,所以++p后,p=&a[1], 再 *p ===> a[1]=2 ,输出 2
    printf("%d,",(*p)++);// (*p)++,(*p)优先,此时p仍为上一句位置所以输出a[1]=2, 再(a[1])++ = 3,此后a[1] = 3 ,输出 2
    printf("%d,",*p);    // *p ===> a[1] = 3, 输出 3
    printf("%d,",*p--);  // *p--, 先 *p ,*p ===> a[1] = 3, 输出 3, 再 p--, p = &a[0], 输出 3
    printf("%d,",--(*p));// --(*p),(*p)优先,*p ====> a[0] = 1, 然后--(a[0]), 此时a[0]=0, 输出  0
    printf("%d\n",*p);   // *p ====> a[0]=0, 输出  0
}

写了注释,希望对你有帮助,要理解值本身和指针之间的关系:


#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int a[] = { 1, 2, 3, 4, 5 };

    int *p = a /* 指针p指向数组a的第一个元素 */ ;

    printf("%d,", *p) /* 输出a数组第一个元素的值,1 */ ;

    printf("%d,", *(++p))
        /* 指针p向后移动一个元素位置,也就是数组的第二个元素,并输出这个元素的值,2 
         */
        ;

    printf("%d,", (*p)++)
        /* 输出当前指针指向元素的值,根据上行可知是第二个元素,值为2,所以输出为2,把2输出后再把此元素递增1,此时第二个元素值为3 
         */
        ;

    printf("%d,", *p) /* 输出第二个元素的当前值3 */ ;

    printf("%d,", *p--)
        /* 输出第二个元素的值3后,指针向前移动一个元素位置,此时指针指向第一个元素,值为1 
         */
        ;

    printf("%d,", --(*p))        /* 把第一个元素值减去1后输出,也就是1-1=0,输出0 
                                 */ ;

    printf("%d\n", *p)
        /* 根据上行可知,此时第一个元素的值已经是0,所以输出为0 
         */
        ;
}

【以下回答由 GPT 生成】

首先,我会逐行分析代码并解释其中的计算方式。

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int a[]={1,2,3,4,5};
    int *p=a;

这段代码定义了一个整型数组 a ,并将指针 p 指向数组的第一个元素。

    printf("%d,",*p);

这一行代码打印出指针 p 指向的值,即数组的第一个元素 1

    printf("%d,",*(&++p));

这一行代码比较复杂,我们来一步步解释。首先,++p 将指针 p 的值加 1,所以此处 p 的值变为指向数组的第二个元素。然后,& 取得 ++p 的地址。最后, * 解引用这个地址,得到该地址对应的值。所以这一行代码实际上打印出数组的第二个元素 2

    printf("%d,",(*p)++);

这一行代码也比较复杂,我们再来解释一下。首先, (*p) 解引用指针 p 所指向的地址,得到该地址对应的值,即数组的第二个元素 2。然后,++ 将这个值加 1,所以数组的第二个元素变为 3。但是,此处是后置递增运算符,所以 (*p)++ 的值是递增之前的值,即 2。所以这一行代码实际上打印出数组的第二个元素 2

    printf("%d,",*p);

这一行代码打印出指针 p 指向的值,即数组的第二个元素 3

    printf("%d,",*p--);

这一行代码也比较复杂,我们再来解释一下。首先, *p-- 是先解引用指针 p 所指向的地址,得到该地址对应的值,即数组的第二个元素 3。然后, -- 将指针 p 的值减 1,即指向数组的第一个元素。但是,这是后置递减运算符,所以 *p-- 的值是递减之前的值,即 3。所以这一行代码实际上打印出数组的第二个元素 3

    printf("%d,",--(*p));

这一行代码比较复杂,我们再来解释一下。首先, (*p) 解引用指针 p 所指向的地址,得到该地址对应的值,即数组的第一个元素 1。然后, -- 将这个值减 1,即变成 0。但是,此处是前置递减运算符,所以 --(*p) 的值是递减之后的值,即 0。所以这一行代码实际上打印出 0

    printf("%d\n",*p);

这一行代码打印出指针 p 指向的值,即数组的第一个元素 0

综上,代码中的数字计算方式如下:

  1. ++ 运算符将指针的值加 1,即指针指向数组的下一个元素。
  2. -- 运算符将指针的值减 1,即指针指向数组的上一个元素。
  3. * 运算符解引用指针,得到指针所指向地址的值。
  4. ++ 运算符和 -- 运算符在前置时,先进行递增或递减操作,再返回值。
  5. ++ 运算符和 -- 运算符在后置时,先返回值,再进行递增或递减操作。


【相关推荐】



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