首页 > 代码库 > 【扩展知识3】数组的一些难事

【扩展知识3】数组的一些难事

【扩展知识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.comhttp://blog.csdn.net/mirrorsbeyourself

【扩展知识3】数组的一些难事