【扩展知识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
", array[ 1 ] );
         printf( "        *(array+1)= %d
", *(array+ 1) );
         printf( "*( &array[ 0 ]+ 1 )= %d
", *(&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
", array[ 1 ] );
         printf( "        *(array+1)= %d
", *(array+ 1) );
        printf( "     *( &array+ 1 )= %d
", *( &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://oursharingclub.joinbbs.nethttp://blog.csdn.net/mirrorsbeyourself

版权声明:一半的人阅读这篇文章皆有(http://www.bangedushuren.cn/)技术部门LearnCoding(http://it.bangedushuren.cn/)原版的,转载请注明

原文地址:https://www.cnblogs.com/mengfanrong/p/4679836.html