【问题标题】:Retrieval of values in reverse order using pointers [duplicate]使用指针以相反的顺序检索值[重复]
【发布时间】:2017-07-31 11:24:44
【问题描述】:

我了解 *(p+i) 的工作原理,但是,当通过 printf() 函数使用 *(p-i) 或 p[-i] 检索值时,内存级别实际发生了什么?

 #include <stdio.h> 

int main() {    
    int i, arr[5] = {1, 2, 3, 4, 5}, *p;
    p = &arr[4];    
    for (i = 0; i < 5; i++)         
        printf("%d\t%d\t", *(p - i), p[-i]);    
    // why does this prints in reverse order?
    return 0; 
}

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    很简单,*(p - i)p[-i] 完全相同,只是语法不同。有意思的是,你也可以写-i[p],意思完全一样*(p - i)

    它以相反的顺序打印,因为您从 arr[4] 开始,然后从指针中减去 i,指针依次减去 012,直到达到 4,所以它打印p[4]p[3]p[2]p[1]p[0],这是从最后一个元素到第一个元素的数组arr

    【讨论】:

    • 谢谢 Iharob,我已经明白了。但是,在内存级别或字节方面实际发生了什么。
    • 什么意思?你不懂指针算术?
    • 哦! thnks 明白了:p
    • 抱歉这个愚蠢的问题!!
    【解决方案2】:

    您已经分配了指针中的最后一个元素地址并逐个减去地址,因此它以相反的顺序打印

    【讨论】:

    • 假设你的整数每个需要 4 个字节,让 1000 是 arr[0] 的内存位置,那么下面是内存分配 1000=> arr[0] 1004=> arr[1] 1008=> arr[2] 1012=> arr[3] 1016=> arr[4] 现在,当您分配指向 arr[4] 的指针时,它指向位置 1016...现在您将它一一递减,这意味着递减一次 4 个字节
    • 明白了!谢谢
    • 嗨@ninja,如果它是,请通过向上箭头标记这个答案有用:-)
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多