文章目录

  • 1 数组的概念
    • 1.1 数组的大小
    • 1.2 数组的初始化
  • 2 数组的地址与数组名
  • 3 数组名不能作为左值使用
  • 4 总结

1 数组的概念

  • 数组是相同类型的变量的有序集合
  • 数组中的元素没有名字

如下图是一个数组:

1.1 数组的大小

  • 数组的大小是数组元素个数乘以元素的数据类型
  • 数组在一片连续的内存空间中存储元素
  • 数组元素的个数可以显示或者隐式的指定

那么数组a[0]=1,a[1]=2,a[2]=0,a[3]=0,a[4]=0

数组b的元素个数是2,b[0]=1,b[1]=2.

sizeof(a) = 20,sizeof(b)=8

数组的元素的个数可以使用下面的公式求解:

cnt = sizeof(array)/sizeof(type)

想要将数组全部初始化为0,直接写:

int a[5]  = {0};

1.2 数组的初始化

如下代码27-1.c:

#include <stdio.h>int main()
{int a[5] = {1, 2};int b[] = {1, 2};printf("a[2] = %d\n", a[2]);printf("a[3] = %d\n", a[3]);printf("a[4] = %d\n", a[4]);printf("sizeof(a) = %d\n", sizeof(a));printf("sizeof(b) = %d\n", sizeof(b));printf("count for a: %d\n", sizeof(a)/sizeof(int));printf("count for b: %d\n", sizeof(b)/sizeof(int));return 0;
}
  • 编译运行结果为:

2 数组的地址与数组名

  • 数组名代表数组首元素的地址,但是如果想要获取数组的地址,还是需要加上&地址获取符。如&a是数组a的地址。这里有一点不能绕晕了,如果a是数组,那么a的值与&a的值是相等的。这与普通变量是不一样的。
  • 整个数组的地址值等于数组第一个元素的地址,它们在数值上相等,但是意义不一样。

如下代码27-2.c:

#include <stdio.h>int main()
{int a[5] = { 0 };printf("a = %p\n", a);printf("&a = %p\n", &a);printf("&a[0] = %p\n", &a[0]);return 0;
}

运行结果如下:

注意:

  • 如果想获取整个数组的地址,只能这样获取:int* p =&a 。那么p就是数组的地址,p+1就是数组最后一个元素的下一个地址。

  • 但是如果直接用int *p = a, p+1就是数组的第二个元素的地址。对于&a[0]也是一样的

为什么会不同的呢?实际上可以这么理解:

  1. 数组名a只是代表数组首元素的地址值,它不包含数组的长度信息,所以a+1就直接相当于数组的第二个元素的地址
  2. 而&a代表整个数组的地址,它包含了数组的长度信息,所以在&a + 1时,相当于直接越过了整个数组的长度,调到数组的末尾的下一个元素的地址。

3 数组名不能作为左值使用

  • 数组与指针是不同的。

这个话题,会在后面有专门的两篇文章学习。所以这里只是简单说一点:

  1. 在表达式中,数组名只能作为右值使用,不能作为左值使用
#include <stdio.h>int main()
{int a[5] = {0};int b[2];int* p = NULL;p = a;printf("a = %p\n", a);printf("p = %p\n", p);printf("&p = %p\n", &p);printf("sizeof(a) = %d\n", sizeof(a));printf("sizeof(p) = %d\n", sizeof(p));printf("\n");p = b;printf("b = %p\n", b);printf("p = %p\n", p);printf("&p = %p\n", &p);printf("sizeof(b) = %d\n", sizeof(b));printf("sizeof(p) = %d\n", sizeof(p));b = a;return 0;
}

上述代码编译会出错:

将第27行注释掉,就可以编译运行:

这说明,在表达式中,数组名不能作为左值使用

4 总结

  • 数组是一片连续的内存空间
  • 数组的地址数组首元素的地址 意义不同
  • 数组名不能作为左值使用

【C语言进阶深度学习记录】二十三 数组的本质分析相关推荐

  1. 【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

    今天学习C语言中的数据类型的本质与变量的本质 文章目录 1 什么是数据类型 2 变量的本质 3 数据类型与变量的关系 4 自定义数据类型与创建变量 5 总结 1 什么是数据类型 数据类型可以理解为固定 ...

  2. 【C语言进阶深度学习记录】十三 C语言中 ++和--操作符

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...

  3. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

  4. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  5. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  6. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  7. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  8. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  9. 【C语言进阶深度学习记录】五 C语言中变量的属性

    上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...

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

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

最新文章

  1. Offer是否具有法律效力?
  2. 网络编程 UDP套接字
  3. 计算机专业软件技术专业导论,计算机科学与技术专业导论.docx
  4. 12.多媒体和超链接标签及其应用实例
  5. 中运用_钢琴教学中指法的安排与运用
  6. VB 二进制数组与十六进制字符串相互转换
  7. 1.1.27 word表格里的文字不显示
  8. google浏览器不能登录
  9. 2008.5调试安装hp dl385 两台hp dl585
  10. java中getHeight是什么意思_Java PImage.getHeight方法代码示例
  11. 51单片机应用行列反转法操纵矩阵键盘
  12. 飞思卡尔单片机 时钟初始化及配置
  13. python画三色柱状图_python画柱状图--不同颜色并显示数值的方法
  14. linux ps命令什么意思,linux之ps命令详解
  15. JAVA获取服务器上的图片信息
  16. 给小朋友讲故事——第一次世界大战(音频)
  17. 计算机为什么有个来宾用户名,电脑里面突然多出来一个叫Guest的账户是怎么回事?...
  18. springboot启动原理及其流程
  19. 鸿蒙真机运行调试步骤
  20. ubuntu壁纸1080p

热门文章

  1. mongo:(1)nosql简介
  2. Java jdk中的部分工具javac javaw javaws javadoc javah javap jar jdb jps的作用
  3. [机器学习笔记]Note8--机器学习应用建议
  4. java空值转datetime,解决Java (Spring boot) 读取数据库字段,datetime 格式为null,抛出异常 Zero date value prohibited...
  5. 流程图中的虚线含义_还在为画流程图烦恼,焦躁?介绍一款画图神器,让你爱上画图!...
  6. CSS3属性——(一)
  7. 第八篇Django分页
  8. 2.mysql优化---增删改优化
  9. 某final神犇的工作感想
  10. saltstack部署java应用失败无日志——CICD 部署