kasumi_official 发表于 2022-12-19 15:52:39

指针

#include <stdio.h>

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

为什么结果会是 2 4 6 8 10 呢
不太明白括号外的++的作用(怎么会对值自增而不是对地址自增呢)

jhq999 发表于 2022-12-20 12:32:16

已经解引用了,当然不对地址自增

kasumi_official 发表于 2022-12-20 19:39:41

jhq999 发表于 2022-12-20 12:32
已经解引用了,当然不对地址自增

但是两个自增符号之间的计算顺序怎么判断呢,为什么是先让值加一再让地址加一呢

jhq999 发表于 2022-12-20 20:32:56

本帖最后由 jhq999 于 2022-12-20 21:00 编辑

kasumi_official 发表于 2022-12-20 19:39
但是两个自增符号之间的计算顺序怎么判断呢,为什么是先让值加一再让地址加一呢
除非考试不建议死扣这玩意儿,可能不同编译器结果不一样,建议编程时尽量分解
例如这个可以分解成
(*q)++;
q++;
00E31428mov         eax,dword ptr ;先解引用把指针q赋给eax
00E3142Bmov         ecx,dword ptr //把指针q所指向的内存里的值赋给ecx
00E3142Dadd         ecx,1                        ;ecx加一
00E31430mov         edx,dword ptr         ;指针p赋给edx
00E31433mov         dword ptr ,ecx;把加一后的值赋给指针q所指向的内存
00E31435mov         eax,dword ptr         ;把指针q赋给eax
00E31438add         eax,4                ;eax加一,因为int是4个字节,所以汇编加4
00E3143Bmov         dword ptr ,eax;把加一后的eax赋给q
00E3143Ejmp         f+27h (0E31417h)

kasumi_official 发表于 2022-12-22 10:14:58

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

谢谢 我就是在往年的考试题里看到的{:5_99:}
页: [1]
查看完整版本: 指针