【扩展知识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

时间: 2024-08-24 21:55:40

【扩展知识3】数组的一些难事的相关文章

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

[扩展知识3]一些困难的数组 扩展文件夹 1.        &array+ 1 2.        array+1 3.        &array[ 0 ]+ 1 关于&array+ .array+ 1 和&array[0]+ 1的问题.特别难缠,特难搞懂~-~. 所以今天拿来解说解说. 因为数组中的各元素的存储单元是连续分配的,因此能够用指针形式来訪问数组.数组名就是该数字的首个地址. 如: intarray[100]; array 就是该数组的首地址,其值等于&am

JavaScript基础知识梳理--数组

JavaScript基础知识梳理--数组 1.创建方法 空数组:var obj=new Array(); 指定长度数组: var obj=new Array( size ); 指定元素数组 :  var obj=new Array( 元素1,元素2,....): 单位数组:var obj=new Array[ 元素1,元素2,元素3,...,元素N]; 多维数组:var a=new Array( [数组1],[数组2],[数组3],...,[数组N] ); 2.基本操作 存取数组元素: 单维数组

【扩展知识2】函数strlen()和非函数sizeof的使用

[扩展知识2]函数strlen()和非函数sizeof的使用 [扩展目录] strlen函数 sizeof ( 1 )函数strlen() 原型:size_tstrlen ( const char * str ); 返回C字符串(仅仅支持此类型)的长度. //strlen()的使用 #include <stdio.h> int main( void ) { chararray[ ]= "zhijiandeweixiao"; //指尖的微笑 //array为数组的首个地址 p

【扩展知识2】学习一些重要的知识

[扩展知识二]学习一些重要的知识 [扩展目录] 1.      布尔型,浮点型.指针的变量与0值得比较 2.      类型转换 3.      关键字sizeof和strlen()函数 A:bool变量与0值得比较 布尔型,用于表示布尔值,即逻辑值TRUE(真)和FALSE (假).在C语言中非零即为真,零就为假. 较合理的写法是: //测试环境:win7_32+VC++6.0.有的编译器可能不识bool //bool变量与0,1的比较 #include <stdio.h> int main

038改变状态栏的颜色(扩展知识:关于iOS不同版本的消息通知知识)

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @end ViewController.m 1 #import "ViewController.h" 2 3 @interface ViewController () 4 - (void)userNotificationDidPush:(UIApplication *)appl

【扩展知识4】指针家的野孩子和地址打印

[扩展知识4] 1.        野指针 2.        %p的使用 ( 1 )野指针 定义:野指针"不是NULL指针,是指向"垃圾"内存的指针.[重量级危险人物] 野指针的成因: 1.        指针变量定义时没有初始化. 2.        指针变量free后没有置于NULL. 3.        指针的使用超出范围 程序举例: [ 程序1 ] //指针变量没有初始化 #include<stdio.h> int main( void) { char

C语言基础知识----指针数组 &amp;&amp; 数组指针 &amp;&amp; 函数指针 &amp;&amp;指针函数

指针数组 && 数组指针 char (*ptr)[5]; //定义一个指向数组指针ptr,指向包含5个char类型的数组 char *a[5]; //定义一个指针数组a,包含5个char*类型指针 #include <stdio.h> int main(void) {     char *a[5]={"red","white","blue","dark","green"};   

[面试题总结及扩展知识]同一进程中的线程共享的资源

又是一道腾讯2014年的面试题: A,栈   B,数据段    C,寄存器组    D,文件描述符 这是解释以及相对应的扩展知识: 线程的共性如下: 线程共享的环境包括:进程代码段. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯). 进程打开的文件描述符. 信号的处理器.  进程的当前目录和进程用户ID与进程组ID. 线程的个性如下: 1.线程ID     每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值     由于线程间是并

扩展自己的数组核心库

index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="http://libs.baidu.com/