首页 > 编程语言 > 详细

关于for循环打印数组 arr[i] 和 i[arr]结果一样问题

时间:2021-05-27 11:24:18      阅读:15      评论:0      收藏:0      [点我收藏+]

今天学习了指针,发现一个问题

int main(){
    int arr[5] = {12,23,34,45,56};
    for(int i = 0; i < 5; i++){
        printf("%d  %d\n",arr[i],i[arr]);
    }
}
结果为:
12  12
23  23
34  34
45  45
56  56

打印 arr[i] 和 i[arr]结果一样

这是为什么呢?

这就的从指针数组说起,

32位的X86系统是采用小端存储的,即高位放高地址,低位放地址

字节存放在内存中是按小端存放的,也就是这样

技术分享图片

整型类型占四个字节,四个字节也就是四个物理地址,我们用四个地址中的低地址代表这个数的地址

那么上图中00就代表这个数的地址

首先我们打印一下数组的地址,也说明了这一点

int main(){
    int arr[5] = {12,23,34,45,56};
    for(int i = 0; i < 5; i++){
        printf("%x \n",&arr[i]);
    }
}
结果为:
65fe00 
65fe04 
65fe08
65fe0c
65fe10

那么打印数组的本质就是将数组的元素当成指针来求值,也就是 ar[i] ==> *(ar+sizeof(int)*i)

比如:一个数组int ar[5] = {12,23,34,45,56};

ar就代表数组首元素的地址,如果求下一个元素的值,

那么本质就是给首元素地址加上指针类型的长度(指针占四字节,也就是sizeof(int) ),再解引用

int main(){
    int ar[5] = {12,23,34,45,56};
    int *p = ar;    //ar代表数组首元素的地址,只有指针类型可以接收
    for(int i = 0; i < 5; i++,p++){       
        printf("%d %d %d %d\n",ar[i],*(ar+i),i[ar],*p);
                        //ar[i] ==> *(ar+i)  求ar[i]的实质就是转成指针计算,再解引用
                        //i[ar] ==> *(i+ar)
    }
}
结果为:
12 12 12 12
23 23 23 23
34 34 34 34
45 45 45 45
56 56 56 56

关于for循环打印数组 arr[i] 和 i[arr]结果一样问题

原文:https://www.cnblogs.com/fgxr/p/14815655.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!