#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);
}
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,即指针指向数组的上一个元素。*
运算符解引用指针,得到指针所指向地址的值。++
运算符和 --
运算符在前置时,先进行递增或递减操作,再返回值。++
运算符和 --
运算符在后置时,先返回值,再进行递增或递减操作。【相关推荐】