鱼C论坛

 找回密码
 立即注册
查看: 2853|回复: 4

[已解决]指针

[复制链接]
发表于 2022-12-19 15:52:39 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

void f(int* q, int n)
{
        for (int i=0;i<n;i++)
                (*q++)++;
}
void main()
{
        int a[5] = { 1,3,5,7,9 }, i;
        f(a, 5);
        for (i = 0; i < 5; i++)
                printf("%3d", a[i]);
}

为什么结果会是 2 4 6 8 10 呢
不太明白括号外的++的作用(怎么会对值自增而不是对地址自增呢)
最佳答案
2022-12-20 12:32:16
已经解引用了,当然不对地址自增
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-20 12:32:16 | 显示全部楼层    本楼为最佳答案   
已经解引用了,当然不对地址自增
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-20 19:39:41 | 显示全部楼层
jhq999 发表于 2022-12-20 12:32
已经解引用了,当然不对地址自增

但是两个自增符号之间的计算顺序怎么判断呢,为什么是先让值加一再让地址加一呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-20 20:32:56 | 显示全部楼层
本帖最后由 jhq999 于 2022-12-20 21:00 编辑
kasumi_official 发表于 2022-12-20 19:39
但是两个自增符号之间的计算顺序怎么判断呢,为什么是先让值加一再让地址加一呢

除非考试不建议死扣这玩意儿,可能不同编译器结果不一样,建议编程时尽量分解
例如这个可以分解成
(*q)++;
q++;
00E31428  mov         eax,dword ptr [q]  ;先解引用把指针q赋给eax
00E3142B  mov         ecx,dword ptr [eax]  //把指针q所指向的内存里的值赋给ecx
00E3142D  add         ecx,1                          ;ecx加一
00E31430  mov         edx,dword ptr [q]          ;指针p赋给edx
00E31433  mov         dword ptr [edx],ecx  ;把加一后的值赋给指针q所指向的内存
00E31435  mov         eax,dword ptr [q]          ;把指针q赋给eax
00E31438  add         eax,4                  ;eax加一,因为int是4个字节,所以汇编加4
00E3143B  mov         dword ptr [q],eax  ;把加一后的eax赋给q
00E3143E  jmp         f+27h (0E31417h)  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-12-22 10:14:58 | 显示全部楼层
jhq999 发表于 2022-12-20 20:32
除非考试不建议死扣这玩意儿,可能不同编译器结果不一样,建议编程时尽量分解
例如这个可以分解成
(*q) ...

谢谢 我就是在往年的考试题里看到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 00:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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