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