零基础学C语言——数组

这是一个C语言系列文章,如果是初学者的话,建议先行阅读之前的文章。笔者也会按照章节顺序发布。

上一篇我们讨论过函数,其中涉及到了一些数组和指针,本篇详细说明数组。

数组定义

**数组是一种集合结构,与数学种谈到的集合类似,用来存放同类型数据。**在C语言中,数组是定长的,即数组有其最大长度限制,超过限制的访问会导致程序崩溃或异常行为。

定义一个数组的一般形式如下:

数据类型 数组名[数组长度];

其中,数据类型不仅包含了之前文章中介绍的几种基础数据类型,还包含后续文章将会介绍的自定义类型、结构体类型等,数组长度为整数,数组名的命名规则与变量的命名规则一致。

下面看几种数组定义的例子:

int i_array[100]; //定义整型数组,名为i_array,数组长度为100,即可以容纳100个整数

char c_array[100]; //定义字符型数组,名为c_array,数组长度为100,即可容纳100个字符

数组声明

数组的声明与函数和变量的声明作用是一样的,是为了告诉编译器,这个数组在本文件或者其他源文件中有定义,避免当前文件编译因找不到定义而报错。

数组声明的一般形式:

数据类型 数组名[数组长度];

看似与数组定义一样,是的,的确可以写成一样的,但数组长度可以省略:

int i_array[100];

int i_array[];

这两个声明是等价的。

这里需要注意,如果省写数组长度,那么在使用sizeof计算i_array长度时编译器会报错

数组初始化

在定义变量时,我们可以定义并赋初值,数组亦然,但是数组有几种定义并初始化的写法:

1.定义并给出全部初始值

int a[3] = {1, 2, 3};

int a[] = {1, 2, 3};

即初值用{}包裹,且每个元素间用逗号隔开。

对于同时给定初始值的定义,我们是可以省略数组长度的,因为编译器会根据初始值内容判断数组长度。

2.定义并给出部分初始值

int a[3] = {1, 2};

此时数组长度不可省写,否则将被认为数组只有两个元素。数组a的前两个元素分别是1和2,第三个元素数值未知。

3.定义字符数组

字符数组的定义赋初值写法与其他基础类型的定义有所不同

char s[6] = "hello";
char s[] = "hello";

上面这两者是等价的,即定义了一个数组长度为6的字符数组。

细心的读者可能会发现,hello只有五个字符,为什么会是6个元素长度呢?

这是因为双引号内的字符串(也是字符数组)都隐含的在最后包含了一个’\0’字符来表示字符串结束。因此这类字符串的长度都是双引号内字符个数总和加1。如果使用sizeof运算符计算s的长度,返回的数值就是6。

对于字符型数组(不管是char还是unsigned char)有一种特殊的初始化写法——定义并将数组元素值都清零

char s[100] = {0};
unsigned char us[100] = {0};

此时,数组长度不可省略,且这里不只是初始化数组的第一个元素,而是将数组全部元素值设置成0。

这样的写法仅限于清零,如果换用别的数值,则会变成部分初始化。

数组元素

其实,数组本质上也是一片连续的内存空间,与我们在变量一篇中停车场例子很像。
在这里插入图片描述

事实上,数组的每一个元素单元就是一个变量

我们再次以停车位使用为例来看下数组元素是如何被使用的。这里,我们假设举例镜头最近的停车位位置记为0,并向远处依次加一,且假定这一排有10个停车位。

那么这样一排停车位转换到C语言上,可以如下定义:

int parking_area[10];

之所以定义为整型,是因为每一种车型都可以用一个独特的整数来代替其名字,即车名与整数做了一个映射关系。

此时,一辆宝马驶入第1个车位,我们假定宝马对应整数为1000,那么代码可以写成:

parking_area[0] = 1000; //上面提到过第一个车位的位置为0

这里,我们用到了数组下标运算符。

本篇文章中,数组元素的访问都是通过下标来进行的,关于指针访问元素留待后续指针文章中讨论。

数组的下标个数与数组长度相等,且下标数值从0开始依次加1,即上例中的下标为0~9。

这时又来了一辆奔驰(对应整数记为1001),停入了第二个车位,那么代码如下:

parking_area[1] = 1001;

如果,宝马开走了(假设无车停放记为0),那么代码可以写成:

parking_area[0] = 0;

一个可编译运行的例子

#include <stdio.h>

int main(void)
{
    char a[10] = {0};
    int i;
    for (i = 0; i < sizeof(a); ++i) {
        printf("%d\n", a[i]);
    }
    return 0;
}

大家可以编译运行一下例子,这里是将定义数组a并将其所有元素全部清0。然后使用数组下标配合循环语句完成数组元素的遍历访问。关于循环的内容,将在后续文章中给出。

多维数组

上面讨论的内容涉及到的例子都是一维数组——即每个数组元素都是一个数值而非数组

下面,我们就来介绍复杂一些数组形式,我们以二维数组为例进行演示。

int a[2][3];

这里我们就定义了一个二维数组a,它类似一个2行3列的表格或者矩阵。

对于这个二维数组,定义同时初始化可以使用如下方式:

int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

int a[][3] = {{1, 2, 3}, {4, 5, 6}};

可以看到,其最外层数组包含了两个元素,这两个元素又分别是两个相同长度的一维数组。

同时,在定义同时初始化的情况下,第一维的数组长度可以省略,编译器将以初值中的元素个数自动填充。

二维数组的声明形式如下:

int a[2][3];

int a[][3];

即可以省写一维数组长度部分。

对于二维数组的元素访问,可以用如下形式:

a[0][1] = 10; //第1行第2列元素赋值10
a[1][2] = 99; //第2行第3列元素赋值99

对于更高维度的数组,在日常生产环境下是不多见的,其一般形式如下:

数据类型 数组名[m][n]...;

数据类型 数组名[m][n]... = {{{...},...},...};

特征就是:

  1. 是几维数组,数组名后的方括号就有几个
  2. 是几维数组,初值中就要嵌套几层{}数组
  3. 是几维数组,访问其元素时数组下标运算符([])就要有几个
  4. 对于二维及其以上维度的数组,在定义同时初始化时,只有第一维度的数组长度可以省略
  5. 对于二维及其以上维度的数组,声明时只有第一维度的数组长度可以省略

喜欢的读者可以关注码哥,也可以在下方留言评论,如果有不清楚的地方也可以私信码哥,我会第一时间回复。
感谢阅读!

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

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

相关文章

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作&#xff0c;照着流程操作会清除整个硬盘里的文件&#xff0c;请考虑清楚哦&#xff5e; 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

前端性能优化六:css阻塞

1. css加载会阻塞DOM树的解析和渲染吗? (1). html代码: <!DOCTYPE html> <html lang"en"><head><style>h1 {color: red !important}</style><script>function h () {console.log(document.querySelectorAll(h1))}setTimeout(…

Leetcode—445.两数相加II【中等】

2023每日刷题&#xff08;六十七&#xff09; Leetcode—445.两数相加II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2…

[每周一更]-(第38期):Go常见的操作消息队列

在Go语言中&#xff0c;常见的消息队列有以下几种&#xff1a; RabbitMQ&#xff1a;RabbitMQ是一个开源的AMQP&#xff08;高级消息队列协议&#xff09;消息代理软件&#xff0c;用于支持多种编程语言&#xff0c;包括Go语言。RabbitMQ提供了可靠的消息传递机制和灵活的路由…

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…

让生活更智能,P1600边缘智能网关带你进入智能家居新时代

一、什么是P1600边缘智能网关&#xff1f; 在科技日新月异的今天&#xff0c;我们的生活已经被各种智能产品所包围。而在这个智能化的浪潮中&#xff0c;P1600边缘智能网关以其独特的优势&#xff0c;成为了智能家居的重要组成部分。那么&#xff0c;什么是P1600边缘智能网关呢…

力扣每日一题day38[106. 从中序与后序遍历序列构造二叉树]

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[…

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…

Redis取最近10条记录

有时候我们有这样的需求&#xff0c;就是取最近10条数据展示&#xff0c;这些数据不需要存数据库&#xff0c;只用于暂时最近的10条&#xff0c;就没必要在用到Mysql类似的数据库&#xff0c;只需要用redis即可&#xff0c;这样既方便也快&#xff01; 具体取最近10条的方法&a…

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型&#xff08;sql注入&#xff0c;XSS&#xff09;4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

格雷码独热码生成

一、基本原理 参考&#xff1a;Author Loudrs https://blog.csdn.net/Loudrs/article/details/130542638 自然二进制码转格雷码 //自然二进制数转格雷码 module bin2gray #(parameter width 4 //定义数据的位宽参数为4)(input [width - 1 : 0] bin,output [width - 1 : …

Leetcode 435 无重叠区间

题意理解&#xff1a; 给定一个区间的集合 intervals 要求需要移除区间&#xff0c;使剩余区间互不重叠 目标&#xff1a;最少需要移除几个区间。 解题思路&#xff1a; 采用贪心思路解题&#xff0c;什么是全局最优解&#xff0c;什么是局部最优解。 全局最优解&#xff0c;删…

苏州耕耘无忧物联网:降本增效,设备维护管理数字化转型的引领者

随着科技的快速发展和工业4.0的推动&#xff0c;设备维护管理已经从传统的被动式、经验式维护&#xff0c;转向了更加积极主动、数据驱动的维护模式。在这个过程中&#xff0c;苏州耕耘无忧物联科技有限公司以其深厚的技术积累和丰富的管理经验&#xff0c;引领着设备维护管理数…

7. 结构型模式 - 代理模式

亦称&#xff1a; Proxy 意图 代理模式是一种结构型设计模式&#xff0c; 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff…

Redis单机、主从、哨兵、集群配置

单机配置启动 Redis安装 下载地址&#xff1a;Download | Redis 安装步骤&#xff1a; 1: 安装gcc编译器&#xff1a;yum install gcc 2: 将下载好的redis‐5.0.3.tar.gz文件放置在/usr/local文件夹下&#xff0c;并解压redis‐5.0.3.tar.gz文件 wget http://download.re…

【Linux】权限篇(二)

权限目录 1. 前言2. 权限2.1 修改权限2.2 有无权限的对比2.3 另外一个修改权限的方法2.3.1 更改用户角色2.3.2 修改文件权限属性 3. 第一个属性列4. 目录权限5. 默认权限 1. 前言 在之前的一篇博客中分享了关于权限的一些知识&#xff0c;这次紧接上次的进行&#xff0c;有需要…

flask之文件管理网页(上传,下载,搜索,登录,注册) -- 翔山 第一版

前面说要做一个可以注册&#xff0c;登录&#xff0c;搜索&#xff0c;上传下载的网页&#xff0c;初版来了 第一版主代码 from flask import request, Flask, render_template, redirect, url_for, send_from_directory import bcrypt import ossavePath os.path.join(os.ge…

Qt中字符串转换为JS的函数执行

简介 在 QML 中&#xff0c;将 JavaScript 字符串转换为函数通常涉及使用 Function 构造函数或 eval() 函数。但是&#xff0c;QML 的环境对 JavaScript 的支持有一定的限制&#xff0c;因此不是所有的 JavaScript 功能都可以在 QML 中直接使用。 以下介绍都是在Qt5.12.1…

企业出海-如何保护客户账户安全?

近年来国内企业竞争日益激烈&#xff0c;许多企业在这般环境下难以持续发展。那么该如何获得业务的可持续性增长&#xff0c;如何获取更多的客户的同时开阔公司的视野&#xff1f;出海便是如今帮助国内企业能快速发展壮大的潮流之一&#xff0c;摆脱了局限于国内发展的束缚奔向…

智能优化算法应用:基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于晶体结构算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.晶体结构算法4.实验参数设定5.算法结果6.…