第27课 数组的本质分析
1. 数组的概念
(1)数组是相同类型的变量的有序集合
(2)数组在一片连续的内存空间中存储元素
(3)数组元素的个数可以显示或隐式指定
【编程实验】数组的初始化
1 #include <stdio.h> 2 3 4 5 int main(){ 6 7 8 9 //数组初始化 10 11 int a[5] = {1, 2};//第1、2个元素分别为1、2,其余为0 12 13 int b[] = {1, 2};//编译过程中,编译会为计算数组b的大小 14 15 16 17 int i=0; 18 19 for (i = 0;i < 4;i++) 20 21 { 22 23 printf("a[%d] = %d\n",i,a[i]); 24 25 } 26 27 28 29 printf("sizeof(a) = %d\n",sizeof(a)); //20 30 31 printf("sizeof(b) = %d\n",sizeof(b)); //8 32 33 34 35 printf("count for a: %d\n",sizeof(a)/sizeof(int)); //5 36 37 printf("count for b: %d\n",sizeof(b)/sizeof(int)); //2 38 39 40 41 return 0; 42 43 }
2. 数组地址(&a)与数组名a
(1)数组名a代表数组首元素的地址。因此,第2个元素的地址为a+1,以此类推……。注意a或a+i表示元素的地址。可以用*(a+i)取出元素的值,也可以用a[i]来取出元素的值,因为当编译中遇到a[i]会自动转为*(a+i)。反过来也可知,第1个元素的地址为a或&a[0],第2个元素的地址为a+1或&a[1],第i个元素的地址为(a+i)或&a[i]……
(2)数组的地址需要用取地址符&才能得到。即形如&a取的是整个数组的地址,所以&a+1表示指向整个数组的最后面的位置。
(3)数组的首元素的地址值与数组的地址值相同,但是两个不同的概念。
【编程实验】数组名和数组地址
1 2 #include <stdio.h> 3 4 5 6 int main(){ 7 8 9 10 //将数组每个元素初始化为0 11 12 int a[5] = {0};//含义,将第1个元素初始化为0,其余为0. 13 14 15 16 printf("a = %p\n",a); //首元素的地址 17 18 printf("&a = %p\n",&a); //整个数组的地址,从数值与看,与a一样。 19 20 printf("&a[0] = %p\n",&a[0]);//第1个元素的地址 21 22 23 24 return 0; 25 26 }
3. 数组名的盲点
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。如int a[5]表示a的类型为int[5],所以sizeof(a)表示取整个数组的大小,&a表示数组的地址。
(2)数组名的外延:除了sizeof(a)和&a外,数组名经常可看作是一个常量指针。但要注意这里仅仅是“看作”,而不是真正的指针。不同于指针,数组名只是编译过程中的一个符号,编译器并不为其分配内存,有人称之为“伪变量”。因此,形式a++\a—或a=b(其中b是另一个数组名)这些都是错误的,因为a只是一个符号,编译器会把数组信息(如大小,地址)放入符号表中,每次遇到数组名a时,就会从符号表中取出这个数组的地址,然后用这个固定的地址代替 a,所以这个符号并没有被分配内存空间,而上述操作都是针对变量而言的,故数组名只能做为右值使用。
(3)对数组的引用,如a[i]或*(a+i),只需访问内存一次,而指针的引用如*(p+i)则需要两次,首选通过&p找到p指针,然后加i,再从p+i里面取出的内容。
(4)当数组名作为形参时,将退化为指针。即可以把数组名当成指针来用,这里的sizeof(数组名)为4,即指针的长度。
【实例分析】数组和指针并不相同
1 #include <stdio.h> 2 3 4 5 int main(){ 6 7 8 9 //将数组每个元素初始化为0 10 11 int a[5] = {0}; 12 13 int b[2]; 14 15 int* p = NULL; 16 17 18 19 p = a; 20 21 22 23 printf("a = %p\n",a); //首元素的地址 24 25 printf("p = %p\n",p); //p==a。 26 27 printf("&p = %p\n",&p);//指针p的地址 28 29 30 31 printf("sizeof(a) = %d\n",sizeof(a));//数组的大小:20 32 33 printf("sizeof(p) = %d\n",sizeof(p));//指针的大小为4. 34 35 36 37 printf("\n"); 38 39 40 41 p = b; 42 43 44 45 printf("b = %p\n",b); //首元素的地址 46 47 printf("p = %p\n",p); //p==b。 48 49 printf("&p = %p\n",&p);//指针p的地址 50 51 52 53 printf("sizeof(b) = %d\n",sizeof(b));//数组的大小:8 54 55 printf("sizeof(p) = %d\n",sizeof(p));//指针的大小为4. 56 57 58 59 //a = b; //编译错误,数组名不能作为左值; 60 61 //a++; //编译错误,数组名被编译一个固定地址,相当于0xaabbccdd++的错误 62 63 return 0; 64 65 }
4. 小结
(1)数组是一片连续的内存空间
(2)数组的地址和数组首元素的地址意义不同
(3)数组名在大多数情况下被当成常量指针处理
(4)数组名其实并不是指针,不能将其等同于指针。
转载于:https://www.cnblogs.com/hoiday/p/10056111.html
第27课 数组的本质分析相关推荐
- 【C语言进阶深度学习记录】二十四 指针与数组的本质分析一
文章目录 1 回顾--数组的本质 2 指针的运算 2.1 指针运算代码案例分析 3 指针的比较 3.1 指针运算的应用代码案例分析 4 总结 1 回顾–数组的本质 在之前的文章,已经学习了数组的本质分 ...
- 【C语言进阶深度学习记录】二十五 指针与数组的本质分析二
文章目录 1 数组的访问方式 1.1 数组的访问方式代码分析 2 数组和指针不同 3 a 和 &a 的区别 3.1 指针运算的经典代码案例分析 4 数组作为函数的参数 4.1 数组作为函数参数 ...
- 【C语言进阶深度学习记录】二十三 数组的本质分析
文章目录 1 数组的概念 1.1 数组的大小 1.2 数组的初始化 2 数组的地址与数组名 3 数组名不能作为左值使用 4 总结 1 数组的概念 数组是相同类型的变量的有序集合 数组中的元素没有名字 ...
- C语言笔记 第三十五课 数组参数和指针参数分析
第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...
- 数据结构个人笔记 第12课 数组
数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...
- 量化交易 实战第七课 单因子 IC 分析
量化交易 实战第七课 单因子 IC 分析 概述 代码实现 导包 1. 准备因子数据 2. 准备价格数据 3. 生成通用 Alphalens 结构 4. 计算因子 因子 IC 结果分析 时间序列图和移动 ...
- linux下enum类型占几个字节,第11课 - enum, sizeof, typedef 分析
第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...
- 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )
文章目录 总结 一.多维数组本质 二.完整代码示例 总结 n 维数组名称本质 是 n-1 级数组指针 一.多维数组本质 给定多维数组 : // 声明一个多维数组int array[2][3]; 打印二 ...
- 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
文章目录 I . 扩展属性 总结 II . 扩展属性 定义格式 III . 扩展属性 标准示例 IV . 扩展属性 注意事项 V . 扩展属性 本质分析 VI . 扩展属性 代码示例解析 I . 扩展 ...
- C语言数据类型本质分析
C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...
最新文章
- python什么时候用框架_python爬虫-什么时候选择selenium框架框架?
- 幽灵交易策略_源码 | 幽灵交易者策略
- spark 常用函数介绍(python)
- java实现加密电话号码,有具体的加密流程注释
- java中塑形_Java学习5——接口和多态
- Linux开机启动过程(15):start_kernel()->rcu_init()初始化
- ASP.NET的内置对象
- 巨详细 - Win8 + Hyper-V 虚拟机性能简测与虚拟化技术科普(一)
- SDI在自定义的工具栏上添加下拉控件
- LayaAir destroy 销毁与 removeChild 移除节点
- VassistX的简单介绍与下载安装
- VS2005编译Python源代码
- java gui界面设计,2022最新
- pytorch实用工具总结(GFLOPs如何计算)
- unity利用帧动画制作特效
- 成功解决Cannot uninstall 'pywin32'. It is a distutils installed project and thus we cannot accurately de
- OpenCVSharp学习(十二):图片的逻辑运算
- USRPx310的底板介绍
- Quasi-Dense Similarity Learning for Multiple Object Tracking 详细解读
- 红牛农场java代码_Java面向对象程序设计实验指导模板代码(171页)-原创力文档...
热门文章
- ppt 2016 html,2016第1章HTML5.ppt
- Android自定义View【实战教程】6⃣️---深入理解 Android 中的 Matrix
- 美颜重磅技术之GPUImage源码分析
- 从大厂出来后,我工资翻了一翻
- 使用Mediaplay类写一个播放器
- mysql backup 使用_mysqlbackup (官方使用)
- vuejs知乎_vueJS (简版)amp; 响应式原理
- 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
- login.html id=9453,我关注的官网.html
- python-学生管理系统--2录入学生信息内容以及代码