《C语言程序设计现代方法》note-5 数组

文章目录

    • 助记提要
    • 8章 数组
      • 8.1 一维数组
        • 数组下标
        • 数组初始化
        • sizeof
      • 8.2 多维数组
        • 初始化多维数组
        • 常量数组
      • 8.3 变长数组

助记提要

  1. 数组初始化格式;
  2. 指示器;
  3. 常量数组;
  4. 变长数组;

8章 数组

变量包括标量和聚合变量。标量可以保存单一数据项,聚合变量可以存储成组的数值。
C语言的聚合变量有数组和结构。

8.1 一维数组

数组是含有多个数据值的数据结构,且每个数据值的数据类型都相同。数据值也称为元素。
可以按照元素在数组中的位置把它们选出来。

一维数组中的元素依次排在一行中。

声明具有n个指定类型元素的数组arr:

类型 arr[n];

n可以是任何的(整数)常量表达式。

数组下标

为了存取指定的元素,可以在数组名后边加上一个方括号围绕的整数值。这个操作称为取下标或索引。

数组元素的下标始终从0开始,最大是n-1。n为数组长度。
注意 C语言不检查下标的范围,下标超出范围时,程序会执行预期外的行为。
下面的代码在i=10时,会把0存到a[9]后面。如果刚好后面的内存中是程序会用到的变量,这个变量值就会变为0。

int a[10], i;
for (i = 0; i <= 10; i++)
    a[i] = 0;

数组下标可以是任何整数表达式。但是为了便于理解,尽量不要在下标中使用有副作用的表达式。

数组和for循环搭配的惯用法:

// 清空
for (i = 0; i < n; i++)
    a[i] = 0;

// 读取数据存到数组
for (i = 0; i < n; i++)
    scanf("%d", &a[i]);

// 求和
for (i = 0; i < n; i++)
    sum += a[i]
数组初始化

数组可以在声明时给予初始值。

  • 初始化常用的格式是使用花括号包起来的常量表达式列表,逗号分隔;
  • 初始化列表比数组短时,数组的剩余元素赋值为0;
  • 初始化列表不能为空,也不能比数组大小长;
  • 给定初始化列表时,可以不写数组长度,编译器会利用列表长度确定数组大小。
// 初始化
int a[5] = {1, 2, 3, 4, 5};

// 剩余元素为0
int a[5] = {1, 2};

// 初始化全为0的数组
int a[5] = {0};

// 省略数组大小
int a[] = {1, 2, 3, 4, 5};

有时初始化时只需要对数组中的一部分元素赋值,其他元素默认为0即可。

// 直接赋值,数组越长越麻烦
int a[10] = {0, 0, 0, 7, 0, 0, 0, 0, 0, 4};

// 初始化0数组再分别赋值,赋值项多会很麻烦
int a[10] = {0};
a[3] = 7; 
a[9] = 4;

对于这个问题,C99提供了由方括号和常量表达式组成的指示器

int a[10] = {[3] = 7, [9] = 4};

指示器赋值的顺序不影响结果。
指示器的方括号内必须是整数表达式,且值不能超过数组下标上限。如果数组长度省略,指示器可以指定任何非负整数,编译器会按照其中的最大值推断数组的长度。

可以在逐个元素初始化的同时使用指示器:

int c[10] = {2, 1, [5] = 7, 6, 3, [9]=11};

指示器使用下标对元素多次初始化是合法操作,但是注意不要这么做。

// 重复初始化元素
int a[] = {4, 9, 1, 8, [0] = 5, 7};
// 上述声明的等价声明
int a[] = {5, 7, 1, 8};

编译器初始化数组时,会记录下一个待初始化的元素的位置。
指示器会强制指定一个元素做为编译器处理的下一元素,编译器从这个元素往后依次处理。

sizeof

sizeof可以确定数组的字节数。

利用数组大小除以数组元素的大小,可获取数组长度。这种方式写的表达式在数组长度需要改变时也不用重写:

for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	a[i] = 0;

有的编译器会对表达式i < sizeof(a) / sizeof(a[0])给出警告,因为sizeof但会的类型是size_t,不是int,把有符号整数和无符号整数相比较是危险的,虽然这里没有问题(都是正数)。
为了避免这个警告,可以把表达式的类型强制转为有符号整数或定义宏来表示它。

// 转为有符号整数
for (i = 0; i < (int) (sizeof(a) / sizeof(a[0])); i++)
    a[i] = 0;
#define SIZE ((int) (sizeof(a) / sizeof(a[0])); i++)
for (i = 0; i < SIZE; i++)
    a[i] = 0;

8.2 多维数组

数组可以有任意维度。每个维度的下标都以0开始。

// 创建二维数组
int m[5][9];

// 访问二维数组的元素
m[i][j];

注意 m[i][j]不可以写成m[i, j]。中括号内的逗号会被当做逗号运算符,m[i, j]等同于m[j]

多维数组在内存中仍然是按照行存储的。写程序时可以忽略这一细节,但是有时也会影响。

初始化多维数组

一维初始化格式嵌套可以初始化高维数组。

int m[3][4] = {{1, 1, 1, 1},
               {2, 2, 2, 2},
			   {3, 3, 3, 3}};
  • 如果嵌套的初始化列表没有填满多维数组,就把数组剩余的元素赋值为0;
  • 可以省略内层的花括号,编译器填满一行后开始填下一行。但是最好不要这样做,避免多填或少填元素的行影响整个数组。

C99的指示器也可以用于多维数组:

// 使用指示器初始化2×2的单位矩阵
int a[2][2] = {[0][0] = 1, [1][1] = 1};
常量数组

在声明时前面加上const,可以使数组称为常量数组。

const char hex_chars[] = {
    '0', '1', '2', '3', '4', '5', '6', '7', 
	'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

程序不应该修改声明为const的数组,编译器会在发现数组被修改时提示错误。
这样的数组常常包含一些在程序执行中不会改变的参考信息。

8.3 变长数组

C99中允许数组变量的长度为非常量的表达式。
变长数组的长度在程序执行时计算,而不是在编译时计算。

由程序员指定数组长度的话,长度可能过长或过短。
变长数组的好处是不需要在构造数组时给定长度,而是在执行时精确计算长度。

变长数组的限制是没有静态存储期和没有初始化器。

goto语句不能绕过变长数组的声明。这样会导致程序对未分配空间的数组中的元素进行访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序:vant组件库安装步骤

前言&#xff1a;在微信小程序中引用vant组件报错&#xff0c;提示路径不存在&#xff0c;这很有可能是因为没有安装构建vant组件库导致。下面是我整理的安装vant组件库的步骤: 第一步&#xff1a;安装node.js(执行完第一步请重启小程序) 具体步骤请看链接&#xff1a;node.js…

蓝桥杯-洛谷刷题-day3(C++)

目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别 keyword 与 text 区别term 查询match 查询match_phrase 查询match_phrase_prefix 查询写在最后 在讲述 es 查询时 term、match、match_phrase、match_phrase_prefix 的区别之前&#xff0c;先来了…

Restful API接⼝简介及为什么要进⾏接⼝压测

一、RESTful API简介 在现代Web开发中&#xff0c;RESTful API已经成为一种标准的设计模式&#xff0c;用于构建和交互网络应用程序。本文将详细介绍RESTful API的基本概念、特点以及如何使用它来设计高效的API接口。 1. 基于协议 HTTP 或 HTTPS RESTful API通常使用HTTP&am…

Android Studio 控制台输出的中文显示乱码

1. Android Studio 控制台输出的中文显示乱码 1.1. 问题 安卓在调试阶段&#xff0c;需要查看app运行时的输出信息、出错提示信息。乱码&#xff0c;会极大的阻碍开发者前进的信心&#xff0c;不能及时的根据提示信息定位问题&#xff0c;因此我们需要查看没有乱码的打印信息。…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

ubuntu固定ip

根据自己的VMware中的网关信息和ip信息设置。 然后进入到ubuntu虚拟机的网络设置目录 cd /etc/netplan nano 01-network-manager-all.yaml根据自己的ip来设置!](https://i-blog.csdnimg.cn/direct/f0be245ced5143618c059d6f0734ed81.jpeg#pic_center) 应用你的设置 sudo ne…

阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统

近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;fecommunity 投稿&#xff09; ReactPress&#xff1a;一款值得推荐的开源发布平台 …

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力&#xff0c;覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中&#xff0c;项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化&#xff0c;不仅是技术层面的革新&#xff0c;更是团队协…

如何从头开始构建神经网络?(附教程)

随着流行的深度学习框架的出现&#xff0c;如 TensorFlow、Keras、PyTorch 以及其他类似库&#xff0c;学习神经网络对于新手来说变得更加便捷。虽然这些框架可以让你在几分钟内解决最复杂的计算任务&#xff0c;但它们并不要求你理解背后所有需求的核心概念和直觉。如果你知道…

[flask][html]如何取消marker伪元素

【背景】 flask做项目时,导航栏默认出现小圆点,很难看,希望能够去除。 【分析】 前端查看后,发现是自动生成的伪元素::marker。 【方法】 找到相应的标签,我的情况是li,追加style。 style="list-style: none;"完整li部分: <li class="</

02-分布式对象存储设计原理

02-分布式对象存储设计原理 保存图片、音视频等大文件就是对象存储&#xff1a; 很好的大文件读写性能 还可通过水平扩展实现近乎无限容量 并兼顾服务高可用、数据高可靠 对象存储“全能”&#xff0c;主要因为&#xff0c;对象存储是原生分布式存储系统&#xff0c;相比MySQL、…

【论文复现】STM32设计的物联网智能鱼缸

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STM32设计的物联网智能鱼缸 【1】项目功能介绍【2】设计需求总结【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】ESP8266工作模式…

『OpenCV-Python』视频的读取和保存

点赞 + 关注 + 收藏 = 学会了 推荐关注 《OpenCV-Python专栏》 上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。 视频的来源主要有2种,一种是本地视频文件,另一种是实时视频流,比如手机和电脑的摄像头。 要读取这两种视频的方法都是一样的…

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办&#xff0c;承办&#xff0c;支持单位 会议官网 www.icirac.org 大会时间&#xff1a;2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09;由华南理工大学主办&#xff0c;会议将于2024年11月29日-12月1日在中国广…

table详细用法

注意&#xff1a;table元素上的很多属性都已经被废弃了&#xff0c;建议使用css方式替代。 表格的box-sizing默认值为border-box 例如&#xff1a; border-collapse属性 border-collapse CSS 属性是用来决定表格的边框是分开&#xff08;separate&#xff09;默认值的还是合并…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

ZooKeeper单机、集群模式搭建教程

单点配置 ZooKeeper在启动的时候&#xff0c;默认会读取/conf/zoo.cfg配置文件&#xff0c;该文件缺失会报错。因此&#xff0c;我们需要在将容器/conf/挂载出来&#xff0c;在制定的目录下&#xff0c;添加zoo.cfg文件。 zoo.cfg logback.xml 配置文件的信息可以从二进制包…

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中&#xff0c;我们经常需要对特定时间段内的数据进行统计和分析。 例如&#xff0c;在名片进线的场景中&#xff0c;我们可能需要了解一天内每小时的名片进线数量。 然而&#xff0c;由于某些时间点可能没有数…

厦门凯酷全科技有限公司正规吗?

在这个短视频风起云涌的时代&#xff0c;抖音作为电商领域的黑马&#xff0c;正以惊人的速度改变着消费者的购物习惯与品牌的市场策略。在这场变革中&#xff0c;厦门凯酷全科技有限公司凭借其专业的抖音电商服务&#xff0c;在众多服务商中脱颖而出&#xff0c;成为众多品牌信…