[转组第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*一样。

  

原文地址:https://www.cnblogs.com/nww-570/p/9017475.html

时间: 2024-08-01 15:54:38

[转组第9天] | 数组和指针的寻址的相关文章

基于arm的C++反汇编 数组和指针的寻址

数组在函数内 数组作为参数 数组作为返回值 下标寻址和指针寻址 下标值为整型常量的寻址 下标值为整型变量的寻址 下标值为整型表达式的寻址 数组越界 多维数组 存放指针类型数据的数组 指向数组的指针变量 函数指针 ??虽然数组和指针都是针对地址操作,但它们有许多不同之处.数组是相同数据类型的数 据集合,以线性方式连续存储在内存中:而指针只是一个保存地址值的4字节变量.在使用中,数组名是一个地址常量值,保存数组首元素地址不可修改,只能以此为基地址访问内 存数据:而指针却是一个变量,只要修改指针中所保

数组与指针的本质

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

【好程序员笔记分享】——数组与指针

ios培训 ------我的c语言笔记,期待与您交流! 前面我们介绍了关于C语言的内存分配问题,下面我们就开始介绍关于C语言的两个非常重要的知识点:数组与指针 数组与指针其实不仅仅是再C语言中,再OC中(当然OC是内部已经帮我们处理好了,但是还有存在大量的指针),C#中,C++中等待一些开发中都是非常常见的,所以作为一个程序员是必须掌握的. 一.数组:相同类型的集合 1:一维数组 平时我们都是申明一个变量,那么如果变量很多我们要怎么做呢,这个时候我们就能用到数组,那么什么是数组呢? 首先来看一个

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

再谈数组与指针

首先看如下一下基础: 一.int *p:p是指向一个整数变量的指针 char *p:p是指向一个字符变量的指针 由int data[30]; int *p;有p=data;或p=&datd[1](i=0,1,2,3....) 上面成立的原因:(1)数组名是该数组首元素的地址 (2)&data表示取整个数组的地址,包括多维数组.&data[0]取数组首个元素的地址.单独data则亦表示数  组首元素的地址. (3)p是p是指向一个整数变量的指针 二. int a[3][4]:a是指向

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

什么是指针?什么是数组?指针和数组的关系?

形象地讲,我们可以把计算机的内存看作一条长街上的一排房屋,每个房间都可以容纳数据并通过一个房号来表识.而表示每个房间房号的值我们可以称为地址.或许这样的比喻有局限性,毕竟真实地计算机内存是以数以万计的bit位组成. ⑴初始化: ①最简单的以 int *p 为例,初始化时内存里开辟了四个字节的空间. ▇▇▇▇ ②另一个声明 ,现在,我们有两个变量,下图中显示了后面那个未知内容的内存. char ch = 'a': char cp = &a; ▇→▇▓←(?) (cp)      (ch) ⑵&quo

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

《C专家编程》数组和指针并不同--多维数组

<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并非自身,而是描述其他地方创建的对象,声明可以多次出现: 定义相当于特殊声明:它可以为对象分配内存,只能出现在一个地方. 1.2 数组和指针的访问方式 左值和右值 ???????? X = Y ; 符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方. 符号Y的含义是Y所代表的地址的内容,这被称为右值,右值直到运行时