鱼C论坛

 找回密码
 立即注册
查看: 2050|回复: 5

[已解决]关于C语言指针自加自减问题

[复制链接]
发表于 2019-8-18 23:46:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上代码:

#include <stdio.h>

int main()
{
    int arr[] = {11,12,13,14,15};
    int *ptr = arr;
    *(ptr++) += 100;
    printf("%d %d\n",*ptr,*(++ptr));
   
    return 0;
}


答案运行结果是13,13

但我理解的是,先操作数组0位置,再指向1位置,打印1位置和2位置(先自加,指向下一位置再取值)

求助,谢谢了!
最佳答案
2019-8-19 16:19:08
hanviry 发表于 2019-8-19 10:40
额嗯大概明白,还有就是上面这个:
*(ptr++) += 100;

不是,要按照运算符优先级进行计算
初始时 ptr=arr
接下来*(ptr++) += 100;
括号优先级最高,执行ptr++,实际返回ptr
*(ptr)就是arr[1]即12。
最后计算arr[1]+=100,12+100=112。
因此指针是自加一次。
————————————
a+=b等价于a=a+b,但是要先按照运算符优先级的规则算出a与b才能进行计算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-19 01:21:56 | 显示全部楼层
答案应该是12和13,*(ptr++) += 100; increment ptr 一次,*(++ptr) 先increment 再取值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 08:13:47 | 显示全部楼层
本帖最后由 Python.爱好者 于 2019-8-19 08:15 编辑
#include <stdio.h>

int main()
{
    int arr[] = {11,12,13,14,15};
    int *ptr = arr;
    *(ptr++) += 100;
    printf("%d %d\n",*ptr,*(++ptr));
    
    return 0;
}
这段代码存在误导性的一点在于printf函数。
printf函数的原型是
int __cdecl printf(const char * __restrict__ _Format,...);
注意__cdecl:
__cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。——百度百科
因此,我的理解是,(1)*(++ptr)入栈,ptr更新为arr+2,对应的数是13。(2)接下来*ptr入栈,对应的数依然是13。
证据是把*(++ptr)替换为*(ptr++)输出13 12。
而把printf的参数交换位置时输出12 13。
最后把printf这句话替换为
int p,pp;
        p=*ptr,pp=*(++ptr);
    printf("%d %d",p,pp);

int p=*ptr,pp=*(++ptr);
    printf("%d %d",p,pp);
时输出12 13,因为逗号运算符以及变量的定义是从左到右进行计算的。
所有代码均为本人在dev-c++上测试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 10:40:22 | 显示全部楼层
Python.爱好者 发表于 2019-8-19 08:13
这段代码存在误导性的一点在于printf函数。
printf函数的原型是
int __cdecl printf(const char * __re ...

额嗯大概明白,还有就是上面这个:
*(ptr++) += 100;

是*(ptr++)  = *(ptr++)  +  100的意思吗?
那指针是自增一次还是两次啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 16:19:08 | 显示全部楼层    本楼为最佳答案   
hanviry 发表于 2019-8-19 10:40
额嗯大概明白,还有就是上面这个:
*(ptr++) += 100;

不是,要按照运算符优先级进行计算
初始时 ptr=arr
接下来*(ptr++) += 100;
括号优先级最高,执行ptr++,实际返回ptr
*(ptr)就是arr[1]即12。
最后计算arr[1]+=100,12+100=112。
因此指针是自加一次。
————————————
a+=b等价于a=a+b,但是要先按照运算符优先级的规则算出a与b才能进行计算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 20:50:54 | 显示全部楼层
Python.爱好者 发表于 2019-8-19 16:19
不是,要按照运算符优先级进行计算
初始时 ptr=arr
接下来*(ptr++) += 100;

嗯明白了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表