【C生万物】数组

C语言

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1.数组的概念
  • 2.数组的创建和初始化
    • 2.1数组的创建
    • 2.2 数组的初始化
    • 2.3 指示器
    • 2.4 数组的类型
  • 3.数组的使用
    • 3.1 数组的下标
    • 3.2 数组元素的打印
    • 3.3 数组的输入
  • 4.数组在内存中的存储
  • 5.sizeof 计算数组元素个数
  • 6.二维数组的创建
    • 6.1 二维数组的概念
    • 6.2 二维数组的创建
  • 7.二维数组的初始化
    • 7.1 不完全初始化
    • 7.2 完全初始化
    • 7.3 按照行初始化
    • 7.4 初始化时可以省略行,但是不能省略列
  • 8. 二维数组的使用
    • 8.1 二维数组的下标
    • 8.2 二维数组的输入和输出
  • 9.二维数组在内存中的存储

1.数组的概念

数组的定义:数组就是一组相同类型元素的集合

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
  • 数组中存放的多个数据,类型是相同的。

2.数组的创建和初始化

2.1数组的创建

数组的基本语句:

type arr_name[常量值];

存放在数组的值被称为数组元素,数组在创建的时候可以指定数组的大小数组的元素类型。

  • type指定的是数组中存储的数据类型。
  • arr_name指的是数组名的的名字。
  • []的中常量值用来指定数组大小的。

举例:

  1. 我们想存储20个人的成绩,就可以用数组
int cj[20];
  1. 也可以创建其他类型的数组
char ch[10];
float score[10];

2.2 数组的初始化

像其他变量一样,数组的也可以在声明时获得一个初始值。
数组的初始化器最常见的格式是用一个花括号括起来的常量表达式列表,常量表达式之间用逗号隔开

// 完全初始化
int a1[10] = {1,2,3,4,5,6,7,8,9,10};// 不完全初始化
int a2[10] = {1};// 第一个元素初始化为1,其他的元素默认初始化为0// 错误的初始化 - 初始化项太多
int a[3] = {1,2,3,4};

2.3 指示器

数组中只有相对较少的元素需要进行显式的初始化,而其他元素可以进行默认赋值。
例子:

int a[10] = {0, 0, 10, 0, 0, 0, 18, 0, 9, 0 };

希望元素2为10,元素6为18,元素8为9,而其他元素为0。对于大数组,如果使用这种方式赋值,将是冗长和容易出错的(想象一下两个非0元素之间有200个0的情况)。
C99 中指示器可以用于解决这一问题。上面的例子可以用指示器写为:

int a[10] = {[2] = 10, [6] = 18, [9] = 9};

方括号和其中的常量表达式一起,组成了一个指示器。
除了可以是赋值变得更简短、更易读之外,指示器还有一个优点:赋值的顺序不再是一个问题,我们也可以将先前的例子重写为:

int a[10] = {[9] = 9, [6] = 18, [2] = 10};

组成指示器的方括号里必须是整型常量表达式。

2.4 数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型
如下:

int arr1[10];
int arr2[20];char ch[10];

arr1数组的类型是int [10]
arr2数组的类型是int [20]
ch数组的类型是char [5]

3.数组的使用

学习了数组基本语法,数组可以存储数据,存放数据的目的是对数据的操作。

3.1 数组的下标

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号。
如下:

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

image.png
在C语言中数组的访问提供了一个操作符[],这个操作符叫:下标引用操作符
有了下标引用操作符,我们就可以访问数组的元素了,比如我们要访问下标为7的元素,我们就可以使用arr[7],想要访问下标为3的元素,我们就可以使用arr[3],如下代码:

#include<stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", arr[7]);// 8printf("%d\n", arr[3]);// 4return 0;
}

运行结果:
image.png

3.2 数组元素的打印

只要我们产生数组所有元素的下标就可以了,那我们使用for循环产生0~9的下标,我们使用下标访问就行了。
代码:

#include<stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

运行结果:
image.png

3.3 数组的输入

明白了数组的访问,当然我们也根据需求,自己给数组输入想要的数据。
代码:

#include<stdio.h>int main()
{int arr[10];int i = 0;printf("请输入数组元素:\n");for (i = 0; i < 10; i++){scanf("%d", &arr[i]);}printf("元素如下:\n");for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

运行结果:
image.png

4.数组在内存中的存储

如果我们要深入了解数组,我们最好能了解数组在内存中的存储。
依次打印数组元素的地址:
代码:

#include<stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;	for (i = 0; i < 10; i++){printf("&arr[%d] = %p\n", i,&arr[i]);}return 0;
}

运行结果:
image.png
image.png
从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的

5.sizeof 计算数组元素个数

运算符sizeof可以确定数组的大小(字节数)。如果数组a有10个整数,那么sizeof(a)通常为40(假定每个整数占4字节)。
还可以用sizeof来计算数组元素的大小。用数组的大小除以数组元素的大小可以得到数组的长度:

sizeof(a) / sizeof(a[0])

当需要数组长度时,我们可以采用上述表达式。
例如,数组a的清零操作可以写成如下形式:

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

如果使用这种方法,即使数组长度会改变,也不需要改变循环。

6.二维数组的创建

6.1 二维数组的概念

前面学习的数组被称为一维数组,数组的元素都是内置类型,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组
image.png

6.2 二维数组的创建

那我们如何定义二维数组呢?语法如下:

type arr_name[常量值1][常量值2];// 例如:
int arr[3][5];
double data[2][8];

解释:上述代码中出现的信息

  • 3表达数组有3行
  • 5表示每一行有5个元素
  • int 表达数组的每个元素时整型类型
  • arr 是数组名,可以根据自己的需要指定名字

7.二维数组的初始化

通过嵌套一维数组初始化器的方法可以产生二维数组的初始化器。

7.1 不完全初始化

int arr1[3][4] = {1,2};
int arr2[3][5] = {0};

image.png

7.2 完全初始化

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

image.png

7.3 按照行初始化

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

image.png

7.4 初始化时可以省略行,但是不能省略列

int arr5[][5] = {1,2};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2},{3,4},{5,6}};

image.png

8. 二维数组的使用

8.1 二维数组的下标

访问二维数组也是使用下标的形式的,二维数组是有行和列的,只要锁定行和列就能锁定数组中的一个元素。
C语言规定,二维数组的行和列都是从0开始的,如下所示:

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

image.png
图中最左侧绿色的数字表示行号,第一行蓝色的数字表示列号,都是从0开始的,比如:我要找第2行,第4列的元素:

#include<stdio.h>int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };printf("%d ", arr[2][4]);// 7return 0;
}

运行结果:
image.png

8.2 二维数组的输入和输出

我们只要能够按照一定的规律残生所以的行和列的数字就行,我们可以借助循环实现生成所有的下标。

#include<stdio.h>int main()
{int arr[3][5];int i = 0; // 遍历行int j = 0; // 遍历列// 输入数据printf("请输入数组元素:\n");for (i = 0; i < 3; i++) // 产生行号{for (j = 0; j < 5; j++) // 产生列号{scanf("%d", &arr[i][j]); // 输入数据}}// 输出数据printf("数组元素如下:\n");for (i = 0; i < 3; i++) // 产生行号{for (j = 0; j < 5; j++) // 产生列号{printf("%d ", arr[i][j]); // 输出数据}printf("\n");}return 0;
}

运行结果:
image.png

9.二维数组在内存中的存储

像一维数组一样,我们想知道二位数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址。

#include<stdio.h>int main()
{int arr[3][5] = { 0 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

运行结果:
image.png
image.png
从输入的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素之间也是差4个字节,所有二维数组中的每一个元素都是连续存放的。

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

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

相关文章

教你如何生成自己的专属动态龙新年图像 - Python实现摘要

引言 新年将至&#xff0c;为了给大家带来一丝喜庆和神秘的气氛&#xff0c;我决定用Python编写一个生成专属动态龙图像的小程序。通过这个程序&#xff0c;你可以生成一个独一无二的龙图像&#xff0c;并为它添加动态效果&#xff0c;让它在新年的时刻为你带来好运和祝福。 正…

生成式人工智能攻击的一年:2024

趋势科技最近公布了其关于预期最危险威胁的年度研究数据。生成人工智能的广泛可用性和质量将是网络钓鱼攻击和策略发生巨大变化的主要原因。 趋势科技宣布推出“关键可扩展性”&#xff0c;这是著名年度研究的新版本&#xff0c;该研究分析了安全形势并提出了全年将肆虐的网络…

学习Android的第七天

目录 Android EditText 输入框 设置默认提示文本 范例 获得焦点后全选组件内所有文本内容 范例 限制EditText输入类型 android:inputType 值列表 范例 设置最小行&#xff0c;最多行&#xff0c;单行&#xff0c;多行&#xff0c;自动换行 范例 设置文字间隔 范例 …

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…

MATLAB实现LSTM时间序列预测

LSTM模型可以在一定程度上学习和预测非平稳的时间序列&#xff0c;其具有强大的记忆和非线性建模能力&#xff0c;可以捕捉到时间序列中的复杂模式和趋势[4]。在这种情况下&#xff0c;LSTM模型可能会自动学习到时间序列的非平稳性&#xff0c;并在预测中进行适当的调整。其作为…

Maui blazor ios 按设备类型设置是否启用safeArea

需求&#xff0c;新做了个app&#xff0c; 使用的是maui blazor技术&#xff0c;里面用了渐变背景&#xff0c;在默认启用SafeArea情况下&#xff0c;底部背景很突兀 由于现版本maui在SafeArea有点bug&#xff0c;官方教程的<ContentPage SafeAreafalse不生效&#xff0c;于…

攻防世界 CTF Web方向 引导模式-难度1 —— 11-20题 wp精讲

PHP2 题目描述: 暂无 根据dirsearch的结果&#xff0c;只有index.php存在&#xff0c;里面也什么都没有 index.phps存在源码泄露&#xff0c;访问index.phps 由获取的代码可知&#xff0c;需要url解码(urldecode )后验证id为admin则通过 网页工具不能直接对字母进行url编码 …

物联网数据隐私保护技术

在物联网&#xff08;IoT&#xff09;的世界中&#xff0c;无数的设备通过互联网连接在一起&#xff0c;不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而&#xff0c;随着数据量的剧增&#xff0c;数据隐私保护成为了一个不能忽…

centos中docker操作

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

科研绘图-半小提琴图-

文章目录 前言1.软件安装-Origin 20222.绘制半小提琴图3.绘制径向条形图 前言 本文叙述记录的是一些科研绘图的实现方法&#xff0c;具体介绍从软件安装到实现图表绘制的详细过程。 1.软件安装-Origin 2022 Origin是一款具有丰富绘图功能的科研绘图软件&#xff0c;安装过程…

《MySQL 简易速速上手小册》第8章:事务管理和锁定策略(2024 最新版)

文章目录 8.1 理解 MySQL 中的事务8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 Python 实现银行转账事务8.1.3 拓展案例 1&#xff1a;处理并发事务8.1.4 拓展案例 2&#xff1a;使用 Python 监控事务状态 8.2 锁定机制和事务隔离级别8.2.1 基础知识讲解8.2.2 重点案例&…

?你咋知道我的电脑密码的?---> Mimikatz!

还记得昨天在内网中提到了mimikatz这个工具&#xff0c;那么今天就来和大家讲一下这一款牛逼的工具 但是在这里先祝自己和各位看官新年快乐&#xff0c;万事顺遂 &#x1f409;&#x1f432;&#x1f432;&#x1f432;&#x1f432; 1.Mimikatz的介绍 传说呢&#xff0c;是…

IOS破解软件安装教程

对于很多iOS用户而言&#xff0c;获取软件的途径显得较为单一&#xff0c;必须通过App Store进行下载安装。 这样的限制&#xff0c;时常让人羡慕安卓系统那些自由下载各类版本软件的便捷。 心中不禁生出疑问&#xff1a;难道iOS世界里&#xff0c;就不存在所谓的“破解版”软件…

Linux 软件管理(YUM RPM)

1 YUM yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次…

91 xxl-job executor 还存在 并且 job 正在执行, 但是 job 被标记为 “任务结果丢失,标记失败“

前言 最近出现了一个这样的问题 我们生产环境中的一个 xxl-job 任务, 很大一部分执行记录被标记为 "任务结果丢失&#xff0c;标记失败", 几乎是 98% 吧 然后 调试的时候 存在几个令人疑惑的地方 1. 通过 xxl-job 点击查看任务的执行记录的日志, 日志为空, …

深度学习(13)--PyTorch搭建神经网络进行气温预测

一.搭建神经网络进行气温预测流程详解 1.1.导入所需的工具包 import numpy as np # 矩阵计算 import pandas as pd # 数据读取 import matplotlib.pyplot as plt # 画图处理 import torch # 构建神经网络 import torch.optim as optim # 设置优化器 1.2.读取并处理数据…

秒杀相关问题解决

秒杀 超卖问题 如下,我们先来复现问题,抢购秒杀券的代码逻辑也是很简单, 先判断优惠券是否开始了,是的化,判断库存是否充足,如果是的化,扣减库存,最后创建订单 如下是代码 Override Transactional public Result seckillVoucher(Long voucherId) {//1.查询优惠券SeckillVo…

Spring IoC容器详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本概念 Spring IoC容器是Spring框架的核心组件&#xff0c;它实现了控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;的设计原则。IoC是一种编程思…

【Spring框架】Spring事务的原理

目录 〇、对类或方法的Spring事务属性进行解析 0.1 解析标签 0.2 注册 InfrastructureAdvisorAutoProxyCreator 0.3 判断目标方法是否适合 canApply 0.4 匹配标签 match 0.5 小结 一、Spring事务的实现 1.1 准备事务 1.1.1 收集Transactional注解属性信息&#xff0c;…

2023年全国职业院校技能大赛软件测试赛题第2套

2023年全国职业院校技能大赛 软件测试赛题第2套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …