【擴充知識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.com和http://blog.csdn.net/mirrorsbeyourself