c语言数组本质,c语言数组的本质
数组是相同类型变量的有序集合,从本质上讲,数组的确就如其名,是一整块连续的内存.
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语言数组的本质相关推荐
- 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )
文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...
- 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )
文章目录 总结 一.多维数组本质 二.完整代码示例 总结 n 维数组名称本质 是 n-1 级数组指针 一.多维数组本质 给定多维数组 : // 声明一个多维数组int array[2][3]; 打印二 ...
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针...
切片 切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型) ...
- C语言杂谈:指针与数组 (上) (转)
转自:http://blog.jobbole.com/86400/ 介绍 1> 指针定义:指针是保存变量地址的变量. 2> 本文重点 >> 指针与数组之间的关系 >> ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言指针和二维数组
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...
- C语言再学习 -- 再论数组和指针
之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...
- c语言interrupt函数,中断处理函数数组interrupt[]初始化
在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表,让其指向ignore_intr函数),而在这次初始化期间,系统的0~19号中断(用于分NM ...
- C语言的数组名和对数组名取地址
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
最新文章
- 华为服务器怎么查看系统日志,服务器运行日志查看
- 有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
- Linux 服务器性能参数指标总结
- neo4jd3的使用流程(转载)
- 一道CTF----BUUCTF---练习场---Havefun
- A5D2 GPIO测试
- 24-java版Spark程序读取ElasticSearch数据
- 情爱宝典:识破男女间的“放电”信号
- 中gcd函数_算法|博弈论入门(函数讲解+真题模板)
- JAVA日期安全格式化之SimpleDateFormat和jodaTime,DateTimeFormatter
- caffe---之scale层
- 概要设计说明书模板_实验报告的书写案例word模板
- 信步漫谈之JDK—源码编译
- mysql sjis 校对乱码_MySQL字符集乱码及解决方案分享
- 如何自学计算机access,我是怎样自学access的
- handbrake中文版下载 | HandBrake(大菠萝视频格式转换器)官方中文版V1.3.3视频格式转换器哪个最好用
- 31省市数字经济“十四五”规划路线图
- LTspice绘制方波
- #includefile.h与#includefile.h的区别
- 竞价单页设计需要了解的知识