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

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

时间: 2024-11-03 00:53:44

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

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

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

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

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

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

java Map扩展知识练习

/* map扩展知识. map集合被使用是因为映射关系. 编程实现以下数据: "yureban" -> "01" "zhangsan" "yureban" -> "02" "lisi" "jiuyeban" -> "01" "wangwu" "jiuyeban" -> "02

【扩展知识6】typedef的使用

[扩展知识]typedef的使用 扩展目录 1.        typedef与#define不同处 2.        typedef的使用 A:typedef与#define不同处 typedef是关键字,具有一种高级数据特性,它能够为已经存在的类型重新命别名(标签).它的功能与#define相似,但有3个不同之处:(在<C语言第二回>中也有相关的知识点) 1.        与#define不同,typedef给出的符号仅限于类型,而不是绝对值 2.        typedef的解释有

逆向知识十三讲,汇编中数组的表现形式,以及还原数组

逆向知识十三讲,汇编中数组的表现形式,以及还原数组 讲解数组之前,要了解数组的特性 1.数据具有连续性 2.数据类型相同 比如: int Ary[3] = {0,1,2}; 我们可以看出,上面定义的数组,数据是连续的,其中每个数据类型大小都是int类型(类型也是一样的) 汇编中识别数组: 1.地址连续 2.带有比例因子寻址   (lea  reg32,[xxx  + 4 *xxxx]) 一丶一维数组在汇编中的表现形式 首先说下数组寻址公式,便于下面讲解 公式: 数组首地址 + sizeof(ty