[转组第9天] | 数组和指针的寻址

Posted nww-570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转组第9天] | 数组和指针的寻址相关的知识,希望对你有一定的参考价值。

2018-05-09

《C++反汇编和逆向技术》第八章 数组和指针的寻址 读书笔记

 虽然数组和指针都是针对地址操作,但它们有许多不同之处。数组是相同数据类型的数据集合,以线性方式连续存储在内存中;而指针只是一个保存地址值的4字节变量。在使用中,数组名是一个地址常量值,保存数组首元素地址,不可修改,只能以此为基地址访问内存数据;而指针却是一个变量,只要修改指针中所保存的地址数据,就可以随意访问,不受约束。

 1. 数组在函数内

  对于数组的识别,应判断数据在内存中,是否连续并且类型是否一致,均符合即可将此段数据视为数组。

 2. 数组作为参数

  当数组作为函数形参时,函数参数中保存的是数组的首地址,是一个指针变量,叫数组指针。

  虽然参数是指针变量,但需要特别注意的是,实参数组名为常量值,而指针或形参数组为变量。使用sizeof(数组名)可以获得数组的总大小,而对指针或者形参中保存的数组名使用sizeof只能得到当前平台的指针长度。

技术分享图片

 3. 数组作为返回值

  当返回数组为局部变量数据时,就产生了稳定性问题。因为局部变量已释放。

  局部静态数组有多少元素,也只会检查一次初始化标志位。

 4. 下标寻址和指针寻址

  访问数组的两种方式:下标寻址(“数组[下标]”)和指针寻址。

  指针寻址的方式不但没有下标寻址的方式便利,而且效率也比下标寻址低。由于指针是存放地址数据的变量类型,因此在数据访问的过程中需要先取出指针变量中的数据,然后再针对此数据进行地址偏移计算,从而寻址到目标数据。数组名本身就是常量地址,可直接针对数组名所代替的地址值进行偏移计算。

  ary[n]的地址 = ary的首地址 + sizeof(type)*n

 5. 多维数组

 6. 存放指针类型数据的数组

  顾名思义,存放指针类型数据的数组就是数组中各数据元素都是由相同类型的指针组成,我们称之为指针数组,其语法为:

  类型名*  数组名称  [元素个数];

  char* pBuff[3] = {"Hello","World","!\\r\\n"}  //字符串指针数组定义

  char  cArray[3][10] = {{"Hello"},{"World"},{"!\\r\\n"}};  //二维数组定义

  字符指针数组寻址后,得到的是数组成员内容(指针变量值即字符串地址),而二维数组寻址后得到的却是数组中某个一维数组的首地址。

 7. 指向数组的指针变量(数组指针)

  语法:

  类型名  (*指针变量名称)  [一维数组大小]

 8. 函数指针

  语法:

  返回值类型  ([调用约定,可选] *函数指针变量名称)  (参数信息)

 注意:数组指针和函数指针都只是指针变量,(*指针变量名)是为了解释指针变量指向地址的结构。比如Int* ptr,表示ptr指向地址存储了一个int类型变量。但是由于数组自身元素也有类型,函数地址也有返回值,都需要声明。所以,最前面的类型位置就不变了,用(*指针变量名)表示指针所指地址的结构。功能跟int*一样。

  

 

以上是关于[转组第9天] | 数组和指针的寻址的主要内容,如果未能解决你的问题,请参考以下文章

[转组第8天] | 变量在内存中的位置和访问方式

在堆上创建数组并用指针寻址它们

[转组第3天] | 黑盒测试

[转组第2天] | baby_mips和android xss的调研

[转组第5天] | 天枢分享Reverse入门

数组指针与二维数组的寻址