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课 数组的本质分析相关推荐

  1. 【C语言进阶深度学习记录】二十四 指针与数组的本质分析一

    文章目录 1 回顾--数组的本质 2 指针的运算 2.1 指针运算代码案例分析 3 指针的比较 3.1 指针运算的应用代码案例分析 4 总结 1 回顾–数组的本质 在之前的文章,已经学习了数组的本质分 ...

  2. 【C语言进阶深度学习记录】二十五 指针与数组的本质分析二

    文章目录 1 数组的访问方式 1.1 数组的访问方式代码分析 2 数组和指针不同 3 a 和 &a 的区别 3.1 指针运算的经典代码案例分析 4 数组作为函数的参数 4.1 数组作为函数参数 ...

  3. 【C语言进阶深度学习记录】二十三 数组的本质分析

    文章目录 1 数组的概念 1.1 数组的大小 1.2 数组的初始化 2 数组的地址与数组名 3 数组名不能作为左值使用 4 总结 1 数组的概念 数组是相同类型的变量的有序集合 数组中的元素没有名字 ...

  4. C语言笔记 第三十五课 数组参数和指针参数分析

    第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...

  5. 数据结构个人笔记 第12课 数组

    数据结构个人笔记 第12课 数组 数组 数组的顺序存储 多维数组查找指定元素 示范代码 矩阵(稀疏矩阵)压缩存储(三种方式) 对称矩阵 上(下)三角矩阵 稀疏矩阵 数组 一说起数组,我们的印象中数组往 ...

  6. 量化交易 实战第七课 单因子 IC 分析

    量化交易 实战第七课 单因子 IC 分析 概述 代码实现 导包 1. 准备因子数据 2. 准备价格数据 3. 生成通用 Alphalens 结构 4. 计算因子 因子 IC 结果分析 时间序列图和移动 ...

  7. linux下enum类型占几个字节,第11课 - enum, sizeof, typedef 分析

    第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct.union地位相同,格式如下: // enum每个值的最后 ...

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

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

  9. 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )

    文章目录 I . 扩展属性 总结 II . 扩展属性 定义格式 III . 扩展属性 标准示例 IV . 扩展属性 注意事项 V . 扩展属性 本质分析 VI . 扩展属性 代码示例解析 I . 扩展 ...

  10. C语言数据类型本质分析

    C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...

最新文章

  1. python什么时候用框架_python爬虫-什么时候选择selenium框架框架?
  2. 幽灵交易策略_源码 | 幽灵交易者策略
  3. spark 常用函数介绍(python)
  4. java实现加密电话号码,有具体的加密流程注释
  5. java中塑形_Java学习5——接口和多态
  6. Linux开机启动过程(15):start_kernel()->rcu_init()初始化
  7. ASP.NET的内置对象
  8. 巨详细 - Win8 + Hyper-V 虚拟机性能简测与虚拟化技术科普(一)
  9. SDI在自定义的工具栏上添加下拉控件
  10. LayaAir destroy 销毁与 removeChild 移除节点
  11. VassistX的简单介绍与下载安装
  12. VS2005编译Python源代码
  13. java gui界面设计,2022最新
  14. pytorch实用工具总结(GFLOPs如何计算)
  15. unity利用帧动画制作特效
  16. 成功解决Cannot uninstall 'pywin32'. It is a distutils installed project and thus we cannot accurately de
  17. OpenCVSharp学习(十二):图片的逻辑运算
  18. USRPx310的底板介绍
  19. Quasi-Dense Similarity Learning for Multiple Object Tracking 详细解读
  20. 红牛农场java代码_Java面向对象程序设计实验指导模板代码(171页)-原创力文档...

热门文章

  1. ppt 2016 html,2016第1章HTML5.ppt
  2. Android自定义View【实战教程】6⃣️---深入理解 Android 中的 Matrix
  3. 美颜重磅技术之GPUImage源码分析
  4. 从大厂出来后,我工资翻了一翻
  5. 使用Mediaplay类写一个播放器
  6. mysql backup 使用_mysqlbackup (官方使用)
  7. vuejs知乎_vueJS (简版)amp; 响应式原理
  8. 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
  9. login.html id=9453,我关注的官网.html
  10. python-学生管理系统--2录入学生信息内容以及代码