C语言从入门到精通第11天(数组的基本操作)

news2024/12/28 4:08:17

数组的基本操作

  • 数组的概念
  • 一维数组
  • 二维数组

数组的概念

在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式集合在一起,这些按序排列的同类数据元素的集合称为数组。

在C语言中,数组属于构造数据类型,一个数组可以分解为多个数组数组元素,这些数组的元素可以是基本数据类型或构造数据类型。因此按数组元素的类型不同,数组可分为数值数组、字符数组、指针数组、结构数组等各种类别。

注:
1)数组中的元素的内存地址是连续的
2)同一个数组所有的成员都是相同的数据类型

一维数组

1) 语法

数据类型 数组名[常量表达式]

  • 数组名的命名规范必须满足“标识符的命名规范”
  • 方括号中的常量表达式就是数组的长度,也就是数组中存储元素的个数

例如:

int a[10]:说明数组是整型数组,有10个元素。
float b[10],c[20]:说明数组是实型数组,数组b,有10个元素;数组c,有20个元素。
char ch[20]:说明数组是字符数数组,包含20个元素。

2) 一维数组的初始化
定义一个数组时,需要进行初始化的操作,如果不进行初始化,则数组的内容为随机值。给数组的赋值除了用赋值语句对数组元素逐个赋值外,还可以采用初始化赋值和动态赋值(这里涉及到指针,后面会进行讲解)的方法。

  • 逐个赋值法代码如下:
int main(){
    // 定义一个数组,不进行初始化
    int a[5];
    a[0] = 1;
    a[1] = 2;
    a[3] = 3;
    a[4] = 4;
    return 0;
}
  • 初始化赋值法代码如下:
int main() {
    // 定义一个数组,同时初始化所有成员变量
    int a[6] = {1, 2, 3, 4, 5, 6};

    // 初始化前三个成员,后面的所有元素都设置为0
    int b[6] = {1, 2, 3};

    // 所有的成员设置为0
    int c[6] = {0};

    // []中不定义元素个数,定义时必须初始化
    int d[] = {1, 2, 3, 4, 5};

    // 如果数组定义元素个数,如果不进行初始化,内容为随机值
    int e[3];

    // 输出为 0 0
    // 并没有进行初始化
    printf("%d %d",e[1],e[2]);
    
    return 0;
}

3) 使用下标访问数组中的元素

  • 下标的值必须为整型常量/变量
  • 下标的值从0开始到【数组长度(定义的数组常量)-1】结束

注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。

代码如下:

int main(){
    // 定义一个数组,不进行初始化
    int a[5] = {1,2,3,4,5};
    
    // 对数组中的元素
    for(int i = 0;i<5;i++){
		printf("%d",a[i]);
	}
	
    // 最后一个元素的下标为4
    // 此时我们取出超过数组长度的值
    printf("%d",a[5]); // 输出  32758
    return 0;
}


下面我们来看以下这张图就知道为什么我们会输出这个值:

在这里插入图片描述
由此图可以看出我们内存是由高地址到地址进行排列,并且在内存中每个位置都有可能存储着相应的值,这是未知的。所以当我们取的值超出了数组范围,此时会调用我们内存中的未知值,所以输出了32758。

二维数组

1)语法

数组类型 数组名[常量表达式1][常量表达式2]

  • 我们可以将二维数组当作一个有行有列的二维矩阵
  • 常量表达式1代表矩阵的行数
  • 常量表达式2代表矩阵的列数
  • 二维数组可以理解为由”常量表达式1“个一维数组组成的

例如:

int a[3][4]:可以表示为一个3行4列的二维数组,数组中的元素类型为int类型。

2)二维数组的初始化
二维数组的初始化跟一维数组的初始化相差不大,并且他的存储方式跟一维数组的存储方式是一样的,他的赋值方法也有逐个赋值和初始化赋值。

  • 逐个赋值代码如下:
int main(){
    // 定义一个二维数组,不进行初始化
    int a[2][2];
    a[0][0] = 1;
    a[0][1] = 2;
    a[1][0] = 3;
    a[1][1] = 4;
    
    return 0;
}

  • 初始化赋值代码如下:
int main(){
    // 定义一个二维数组,进行分段赋值
    int a[2][2] = {{1,2},{3,4}};

    // 连续赋值,这里根据数组定义的行列进行自动分配
    int b[2][2] = {1,2,3,4};

    // 部分赋值,只给部分
    // 行列不够,用0来凑
    int c[3][3] = {1,2,3};

    // 输出第3行3列的元素
    printf("Output position 3 hang 3 lie: %d",c[2][2]);
    
    // 0值初始化
    int d[2][2] = {0};
    
    // 不指定行数
    // 此时会根据数组的列数进行自动计算行
    int e[][2] = {1,2,3,4};
    
    // 需要注意的是不能不指定列数
    // 如果不指定列数,那么数组就不能确定到底是有多少列
    // 他的情况就有很多种
    // 不指定将无法进行初始化,程序会报错
    // int f[3][] = {1,3,3,43,4,};
    
    return 0;
}

3)使用下标进行数组元素的访问

  • 行列下标的值必须为整型常量/变量
  • 列下标的值从0开始到【数组长度(定义的数组常量)-1】结束
  • 行下标的值从0开始到【数组长度(定义的数组常量)-1】结束

注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。

代码如下:

int main() {
    // 定义一个2行2列的二维数组
    int a[2][2] = {{1, 2},{3, 4}};

	// 访问第3行第1个元素
    printf("%d",a[2][0]);  // 98564384
    return 0;
}

他的取值方式跟一维数组的操作方式实际上是差不多的,也是超出了数组的长度,程序不会报错,但是返回的值是未知的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊聊如何通过APT+AST来实现AOP功能

前言 如果有使用过spring aop功能的小伙伴&#xff0c;应该都会知道spring aop主要是通过动态代理在运行时&#xff0c;对业务进行切面拦截操作。今天我们就来实现一下如何通过APTAST在编译期时实现AOP功能。不过在此之前先科普一下APT和AST相关内容 APT&#xff08;注解处理…

Nginx的重写功能

一、常用的Nginx 正则表达式 字符涵义以及示例^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次&#xff1b;如“ol*”能匹配“o”及“ol”、“oll”匹配前面的字符一次或多次&#xff1b;如“ol”能匹配“ol”及“oll”、“olll”&#xff0c;但…

智能建筑中电力监控系统的应用与产品选型

摘要&#xff1a;近几十年&#xff0c;中国现代化经济不断发展&#xff0c;计算机技术、信息技术等相关产业也取得了飞跃性的进步。随着商业、生活以及公共建筑不断提高智能管理和节能的要求&#xff0c;电力监控系统开始逐渐渗入人们的日常生活&#xff0c;发挥着不可替代的作…

Graphql中我们应该用什么姿势来实现Resolver?

Graphql中我们应该用什么姿势来实现Resolver? Graphql中我们应该用什么姿势来实现Resolver? 前言设计数据库定义 Type实现 Resolver按需组装查询语句请求数据库GraphQLResolveInfo附录 前言 我最近在用 Graphql 来弥补原先写的 RESTFUL 接口的一些短板。在实践过程中遇到…

实战Websocket

实战Websocket&#xff1a;从入门到自闭 作为前端开发人员&#xff0c;我们经常需要使用 Websocket 实现实时通信功能&#xff0c;如聊天室、实时数据展示、游戏等。近期我在一家公司实习工作中&#xff0c;也遇到了使用 Websocket 的场景&#xff0c;所以开始了解 Websocket …

第四章 使用Maven:IDEA环境

1、创建 Project2、开启自动导入 TIP 各个 IDEA 不同版本在具体操作方面存在一定差异&#xff0c;这里我们以 2019.3.3 版本为例进行演示。其它版本大家灵活变通即可。 第一节 创建父工程 创建 Project 开启自动导入 创建 Project 后&#xff0c;IDEA 会自动弹出下面提示…

有史以来第一次利用 Kubernetes RBAC 攻击后门集群

我们最近发现了有史以来第一个证据&#xff0c;表明攻击者正在野外利用 Kubernetes (K8s) 基于角色的访问控制 (RBAC) 创建后门。 攻击者还部署了 DaemonSets 来接管和劫持他们攻击的 K8s 集群的资源。我们的研究表明&#xff0c;该活动正在积极针对至少 60 个野外集群。 这…

026:Mapbox GL加载矢量切片数据源

第026个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载矢量切片数据源。将矢量源添加到地图。使用其 tileset URL(mapbox:// + tileset ID)添加任何 Mapbox 托管的 tileset。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例…

python@可变对象和不可变对象@按值传递和引用传递@python运行可视化工具

文章目录 可变对象和不可变对象&#x1f388;可视化工具&#x1f388;可变对象和idegeg变量名和内存地址&#x1f388;函数调用对参数的修改&#x1f602;Note 按值传递vs引用传递note&#x1f388;如何借助函数修改外部变量的值?Note 可变对象和不可变对象&#x1f388; 在Py…

这些不可不知的JVM知识

JVM是面试中必问的部分&#xff0c;本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。 先上图&#xff1a; JVM必备知识 1、JVM基本概念 1.1、JVM是什么 JVM 的全称是 「Java Virtual Machine」&#xff0c;也就是我们耳熟能详的 Java 虚拟机。 JVM具备着计算机的…

vue3 Pinia快速入门

为什么是Pinia 怎么说呢&#xff0c;其实在过往的大部分项目里面&#xff0c;我并没有引入过状态管理相关的库来维护状态。因为大部分的业务项目相对来说比较独立&#xff0c;哪怕自身功能复杂的时候&#xff0c;可能也仅仅是通过技术栈自身的提供的状态管理能力来处理业务场景…

huggingface下载的.arrow数据集读取与使用说明

1.数据下载方式&#xff1a;load_dataset 将数据集下载到本地&#xff1a;&#xff08;此处下载的是一个物体目标检测的数据集&#xff09; from datasets import load_dataset # 下载的数据集名称, model_name keremberke/plane-detection # 数据集保存的路径 save_path da…

苹果Mac电脑清理垃圾软件卸载工具CleanMyMac X

最近刚刚入手了一台 M1 Macbook&#xff0c;因为不是很懂下载了很多软件&#xff0c;然后又卸载了一些&#xff0c;导致系统内存在很多垃圾文件&#xff0c;我也不知道怎么清理&#xff0c;后来查询了一些资料&#xff0c;大家都普遍推荐 CleanMyMac X&#xff0c;于是经过我一…

触摸屏是如何诞生的,它又是如何影响和改变着我们的生活?

芊芊玉指在小小的屏幕上滑动&#xff0c;天下事便了然于胸。这就是手机触摸屏给我们的生活带来的改变。 曾几何时&#xff0c;我们是生活在九宫格或者全键盘上的“拇指族”。一股浪潮席卷而来&#xff0c;手机上的实体按键都消失了&#xff0c;虚拟按键仅在需要时出现。触摸屏是…

论文实验1、安装tensorflow运行节点嵌入相关方法

还是官方的教程好使 使用 pip 安装 TensorFlow 只有三步 1.安装python&#xff0c;版本太高不行&#xff0c;在推荐版本里选最高的。 2.安装python虚拟环境venv python -m venv --system-site-packages .\venv .\venv\Scripts\activate 3.在虚拟环境里装tensorflow pip…

vue的watch侦听器、watch的属性 immediate(侦听属性)、deep(侦听一个对象)

1.什么是watch侦听器 watch侦听器允许开发者监视数据的变化&#xff0c;从而针对数据的变化做特定的操作。 语法格式如下: const vm new Vue({el: #app,data: { username: },watch: {//监听username值的变化// newVal 是"变化后的新值”&#xff0c;oldVal 是"变…

Golang每日一练(leetDay0046)

目录 136. 只出现一次的数字 Single Number &#x1f31f; 137. 只出现一次的数字 II Single Number II &#x1f31f;&#x1f31f; 260. 只出现一次的数字 III Single Number III &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f3…

linux docker搭建Zfile

1.下载镜像 docker pull stilleshan/zfile2.创建挂载目录 mkdir -p /opt/docker/zfile #自定义路径3.运行 docker run -d --namezfile --restartalways -p 1111:8080 \-v /opt/docker/zfile/conf:/root/.zfile-v4 \-v /opt/docker/zfile/data:/root/zfile/data \stillesha…

C/C++每日一练(20230425)

目录 1. 成绩分布 ※ 2. 汇总区间 &#x1f31f; 3. 矩阵置零 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 成绩分布 原标题&#xff1a;统计某一单…

基础数据结构-顺序表

顺序表 顺序表定义结构体定义初始化扩容函数打印函数尾插和尾删头插和头删查找函数指定位置插入和删除顺序表销毁 顺序表定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 顺序表又分为…