【扩展知识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://oursharingclub.joinbbs.net和http://blog.csdn.net/mirrorsbeyourself
版权声明:一半的人阅读这篇文章皆有(http://www.bangedushuren.cn/)技术部门LearnCoding(http://it.bangedushuren.cn/)原版的,转载请注明