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

Posted Fgxr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于for循环打印数组 arr[i] 和 i[arr]结果一样问题相关的知识,希望对你有一定的参考价值。

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

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]结果一样问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 数组打印

数组(二维)

关于 ES5 & ES6 数组遍历的方法

js将一维数组转化为二维数组

总结for循环及for循环增强遍历数组,list,set和map

整理一波数组去重方法