c语言指针与数组问题,运算符到底是个什么鬼?

已知指针P指向a[1],则执行*P++后,*p的值是30。
a[1]=20;a[2]=30;

然而
void main()
{
int a[5]={1,2,3,4,5};
int i;
*p=a;
for(i=0;i<5;i++)
{
printf("%d",*p++);
}
}
运行后的结果为12345,1也被运行了,这不是冲突了吗?我听视频老师说什么先取P的值进行间接运算,那么第一题又怎么解释?急求啊,各位!

*p是取p指针所指向的内存内容

*p++是分两个部分的:先取指针内容,再移动指针
而结合具体的代码,移动指针是在本代码之后进行的:
对于第一题来说,当执行时*p++本身的值为a[1]的内容,然后执行p++后指向a[2],所以再取*p的值时,值为30
a[1]=20;a[2]=30;
p=&a[1]//指向a1
c=*p++;//执行*p++时,它的值c应该是20,此语句运行完成后,p批向a2
d=*p;//已经指向a2,所以d的值为30

而第二题来说,可以分成这两步:printf("%d",*p); p++
所以它在执行时,1肯定也是被执行的。因为第一次运行printf语句时,p是指向a【0】的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-27

我觉得这样的问题就是为难初学者,看多了就明白了

    先搜一下运算符的优先级  * 小于++ ,所以p++ 指向了a[2]

    自增自减 运算符 有一个规律   先执行后运算

    先直线printf("%d",*p) 然后运输p++;


你可以搞一个简单的 例如 j=0;

printf("%d",j++);也就明白了先执行后运算这句话了.

第2个回答  2019-08-27
如果单独一句 *p++; 那么确实*p的值变成30。
但是for循环里的printf()中的*p++,它的默认操作是先取*p的值,执行完printf("%d",*p); 再执行p++;追问

这个printf可以算是一种特例吗?

追答

不是特例,这是运算符++的使用规则,与指针结合使用就会稍微复杂。
int c,*ptr;
*ptr = &c;
*ptr++; //*ptr不改变,但是 ptr++了;
*ptr++= 20; //执行结果等于:*ptr = 20; ptr++;
*(ptr++)=20;// 等于上一步
*++ptr = 20; //等于: ptr++, *ptr = 20;,此时就很明显是从右到左结合

相似回答