数组是相同类型变量的有序集合,从本质上讲,数组的确就如其名,是一整块连续的内存.

8B352F19-7304-4657-9770-3C5CC7937CAE.png

从上图可以看到,数组是在一片连续的内存空间中存储元素,并且数组元素的个数可以显示或隐式指定

int a[5] = {1,2}; //显示指定数组元素为5,未初始化的元素默认为0,即a[2]~a[4]的值为0

int b[] = {1,2}; //隐式指定,由编译器自己去识别数组个数,此处识别结果为2

对于数组名与数组地址,以 int a[5]为例,有如下关系:

数组名a代表数组首元素的地址(即 &a[0] == a)

数组的地址需要取地址符&才能得到(即数组的地址为 &a)

数组首元素的地址与数组地址值相同,但是表示的概念不同(即a与&a在数值上相同,但是a代表a[0]的地址,但是&a代表数组在内存中的地址)

在内存中如何读取数组指定下标的内容

以 int a[5]为例, 在如何取到a[3]元素的地址,应该是以a的地址为起始点,偏移3个int长度(这里是12)后,就是a[3]的地址

int a[5] = {1,2,3,4,5};

printf("%lu\n", sizeof(a));

printf("&a =%p\n", a);

printf("&a[0]=%p\n", &a[0]);

printf("&a[1]=%p\n", &a[1]);

printf("&a[2]=%p\n", &a[2]);

printf("&a[3]=%p\n", &a[3]);

printf("&a[4]=%p\n", &a[4]);

20

&a =0x7ffeefbff580

&a[0]=0x7ffeefbff580

&a[1]=0x7ffeefbff584

&a[2]=0x7ffeefbff588

&a[3]=0x7ffeefbff58c

&a[4]=0x7ffeefbff590

删除

栈可以算是受限的线性表。它只允许在表的一端进行数据的输入,删除操作。放入数据的入口即为栈的栈顶,将数据压入栈后,数据所存在的位置即为栈的栈。它在进行插入和删除工作时必须从栈顶元素入手,即就是先进栈的元素后出栈,即先进后出。添加新元素时,可直接将新元素压在栈顶元素之上,而此时的新元素会代替之前的栈顶元素成为栈顶元素。而进行删除操作时,也必须从栈顶元素入手,如需删除的是栈顶元素,则直接从栈中将栈顶元素取出,那么下一个相邻元素则成为栈顶元素,如果所要删除的数据是非栈顶元素,则需将此元素之前的元素依次取出,然后此元素就变成了栈顶元素,做法同上,然后再将之前取出的元素以取出时的逆顺序依次放入

对于数组的使用,需要注意如下几点:

数组名可以看做一个常量指针,即决定了在表达式中数组名只能作为右值使用

数组名 "指向" 的是内存中数组首元素的起始地址

数组名不包含数组的长度信息

只有在下列场合中数组名不能看做常量指针

数组名作为 sizeof 操作符的参数(sizeof(array)得到的是整个数组在内存中占用的空间)

数组名作为 & 运算符的参数

总结:

数组是一片连续的内存空间

数组的地址和数组首元素的地址值相同,意义不同

数组名在大多数情况下被当成常量指针处理

数组名不是指针,不能等同与指针处理

c语言数组本质,c语言数组的本质相关推荐

  1. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

    文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...

  2. 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )

    文章目录 总结 一.多维数组本质 二.完整代码示例 总结 n 维数组名称本质 是 n-1 级数组指针 一.多维数组本质 给定多维数组 : // 声明一个多维数组int array[2][3]; 打印二 ...

  3. go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针...

    切片 切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型) ...

  4. C语言杂谈:指针与数组 (上) (转)

    转自:http://blog.jobbole.com/86400/ 介绍 1> 指针定义:指针是保存变量地址的变量. 2> 本文重点 >> 指针与数组之间的关系 >> ...

  5. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. C语言指针和二维数组

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...

  7. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  8. c语言interrupt函数,中断处理函数数组interrupt[]初始化

    在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表,让其指向ignore_intr函数),而在这次初始化期间,系统的0~19号中断(用于分NM ...

  9. C语言的数组名和对数组名取地址

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

最新文章

  1. 华为服务器怎么查看系统日志,服务器运行日志查看
  2. 有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
  3. Linux 服务器性能参数指标总结
  4. neo4jd3的使用流程(转载)
  5. 一道CTF----BUUCTF---练习场---Havefun
  6. A5D2 GPIO测试
  7. 24-java版Spark程序读取ElasticSearch数据
  8. 情爱宝典:识破男女间的“放电”信号
  9. 中gcd函数_算法|博弈论入门(函数讲解+真题模板)
  10. JAVA日期安全格式化之SimpleDateFormat和jodaTime,DateTimeFormatter
  11. caffe---之scale层
  12. 概要设计说明书模板_实验报告的书写案例word模板
  13. 信步漫谈之JDK—源码编译
  14. mysql sjis 校对乱码_MySQL字符集乱码及解决方案分享
  15. 如何自学计算机access,我是怎样自学access的
  16. handbrake中文版下载 | HandBrake(大菠萝视频格式转换器)官方中文版V1.3.3视频格式转换器哪个最好用
  17. 31省市数字经济“十四五”规划路线图
  18. LTspice绘制方波
  19. #includefile.h与#includefile.h的区别
  20. 竞价单页设计需要了解的知识

热门文章

  1. Sci-Hub十岁生日解封,超233万新论文被放出!总数达到近8800万
  2. PyTorch 版 EfficientDet 比官方 TF 实现快 25 倍?这个 GitHub 项目数天狂揽千星
  3. 牛逼!用 12 万行代码堆出来个 蔡徐坤,编译还能通过!
  4. 100年前伦敦爆发的霍乱,教会了人类什么?
  5. python输入input的用法
  6. 记录一个无水印 免费的录屏软件 【需要登录哔哩哔哩账号】
  7. C C++语言指针学习!(基础篇!) 指针的掌握真滴是分水岭呦~
  8. 经验 | 深度学习优化背后的数学基础
  9. 基于视觉模型强化学习的通用机器人
  10. 词向量到Bert代码——部分习题