【扩展知识3】数组的一些难事
扩展目录
1. &array+ 1
2. array+1
3. &array[ 0 ]+ 1
关于&array+ 、array+ 1 和&array[0]+ 1的问题,特别难缠,特难搞懂~—~。所以今天拿来讲解讲解。
由于数组中的各元素的存储单元是连续分配的,因此可以用指针形式来访问数组,数组名就是该数字的首个地址。
如: intarray[100];
array 就是该数组的首地址,其值等于& array[0]
PS: 通过收地址,可以很快的、方便的访问数组中的其他元素值,方法如下:
首地址+ 偏移量
第i 个元素的值可以是 *(array+i), *(&array[0]+i), array[ i ]
array是数组首元素的首地址,
与&array[0]相同,而&array是取数组首地址。
[程序1]
#include <stdio.h> int main( void ) { int array[ 5 ]= { 1, 2, 3, 4, 5 }; printf( " array[ 1 ]= %d\n", array[ 1 ] ); printf( " *(array+1)= %d\n", *(array+ 1) ); printf( "*( &array[ 0 ]+ 1 )= %d\n", *(&array[ 0 ]+ 1 ) ); return 0; }
运行结果:
array[ 1 ]= 2
*(array+1)= 2
*(&array[ 0 ]+ 1 )= 2
[程序 2]
#include <stdio.h> int main( void ) { int array[ 5 ]= { 1, 2, 3, 4, 5 }; printf( " array[ 1 ]= %d\n", array[ 1 ] ); printf( " *(array+1)= %d\n", *(array+ 1) ); printf( " *( &array+ 1 )= %d\n", *( &array+ 1 ) ); //越界 !!! return 0; }
运行结果:
array[ 1 ]= 2
*(array+1)= 2
*(&array[ 0 ]+ 1 )= 2293440
分析:
array: 是数组首元素的首地址,也就是array[0]的首地址
&array:是取数组的首地址。
&array+ 1:
取数组array的首地址,该地址的值加上sizeof( array ),即&array+ 5* sizeof( int ),也是下一个数组的首地址。
array+ 1://等同于&array[ 0 ]+ 1;
是取数组下一个元素的首地址,就是array[ 1 ]的首地址。
如图所示:
发现&array+ 1的地址越界了,其为array[5]的地址,即&array+ 1= &array+ 5* sizeof( int )。而array+1和&array[0]的地址就是array[1]的地址。
【指尖的微笑】错误在所难免,希望得到大家的指正^-^
转载时保留原文的链接http://codingit.howbbs.com和http://blog.csdn.net/mirrorsbeyourself