《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语句不能绕过变长数组的声明。这样会导致程序对未分配空间的数组中的元素进行访问。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析

前言 在程序员或DBA的日常工作中&#xff0c;编写并执行SQL语句如同日常饮食中的一餐一饭&#xff0c;再寻常不过。然而&#xff0c;在使用命令行或黑屏客户端处理SQL时&#xff0c;常会遇到编写难、错误排查缓慢以及查询结果可读性不佳等难题&#xff0c;因此&#xff0c;图形…

Bugku CTF_Web——No one knows regex better than me

Bugku CTF_Web——No one knows regex better than me 进入靶场 一段PHP代码 <?php error_reporting(0); $zero$_REQUEST[zero]; $first$_REQUEST[first]; $second$zero.$first; if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){$key$…

爬虫——JSON数据处理

第三节&#xff1a;JSON数据处理 在爬虫开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是最常见的数据格式之一&#xff0c;特别是在从API或动态网页中抓取数据时。JSON格式因其结构简单、可读性强、易于与其他系统交互而广泛应用于前端与后端的数…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.OpenHarmony 标准系统启动引导流程 OpenHarmony标准系统默认支持以下几个镜像&#xff1a; 每个开发板都需要在存储器上划分好分区来存放上述镜像&#xff0c;SOC启动时都由bootloader来加载这些镜像&#xff0c;具体过程包括以下几个大的步骤&#xf…

力扣刷题日记之150.逆波兰表达式求值

今天继续给大家分享一道力扣的做题心得今天这道题目是 150.逆波兰表达式求值 题目如下&#xff0c;题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation 1&#xff0c;题目分析 这道题说是一道中等难度的题目&#xff0c;其实如果理解了其中的…

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …

如何知道表之间的关系(为了知识图谱的构建)

今天就简单点&#xff0c;把今天花时间做的一个程序说下。 我们在做常规知识图谱的时候&#xff0c;面临一个问题就是要知道关系是如何建立。如果表的数量比较少&#xff0c;人工来做还是比较容易的。 如果有非常多的表&#xff0c;并且这些表之间的关联关系都不清楚的情况下…

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索

题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识&#xff0c;实现简单的一个小案例&#xff0c;网易云音乐热…

消息中间件分类

消息中间件&#xff08;Message Middleware&#xff09;是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制&#xff0c;允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括&#xff1a; 1. JMS&#xff08;Java Message S…

GoogleCloud服务器的SSH连接配置

首先&#xff0c;Google的服务器默认是通过自带的SSH网页端连接的&#xff0c;比较麻烦和容易断开&#xff0c;不是很好用&#xff0c;常见的解决办法有两种一种是通过修改ssh的配置&#xff0c;添加密码的方式进行连接&#xff0c;一种是通过配置公钥进行连接。 密码连接之前有…

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大&#xff0c;采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

Neo4j Desktop 和 Neo4j Community Edition 区别

Neo4j Desktop 和 Neo4j Community Edition 的主要区别在于它们的用途、功能以及安装和管理方式。以下是这两者的详细对比&#xff1a; 1. Neo4j Desktop Neo4j Desktop 是一个图形化的桌面应用程序&#xff0c;主要为开发人员和个人使用提供了一个便捷的环境来安装、管理和运…

DAY120java审计第三方组件依赖库挖掘FastjsonShiroLog4jH2DB

组件漏洞判断插件 一、Tmall_demo-master&#xff08;fastjson&#xff09; 1、配置文件查找安装组件 1、JSON.parse(json) 2、JSON.parseObject 2、找可控的变量 3、利用组件漏洞 poc:propertyJson{"type":"java.net.Inet4Address","val":&q…

要查看你的系统是 x64(64位)还是 x86(32位),可以按照以下步骤操作

文章目录 1. 通过“系统信息”查看系统架构2. 通过“设置”查看系统架构3. 通过命令提示符查看系统架构4. 通过 PowerShell 查看系统架构5. 通过文件资源管理器查看系统架构总结 要查看你的系统是 x64&#xff08;64位&#xff09;还是 x86&#xff08;32位&#xff09;&…

通过JS删除当前域名中的全部COOKIE教程

有时候需要通过JS来控制一下网站的登录状态&#xff0c;就例如:网站登出功能&#xff0c;我们可以直接通过JS将所有COOKIE删除&#xff0c;COOKIE删除之后&#xff0c;网站自然也就退出了。 那么今天我就给大家分享一段JS的函数&#xff0c;通过调用这段函数就可以实现删除COO…

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2&#xff0c;发现在编写feat…