【C语言】详解数组

news2024/11/15 5:10:37

文章目录

  • 前言
  • 一、数组的概念
  • 二、一维数组
    • 1.一维数组的创建
    • 2.一维数组的初始化
    • 3. 一维数组的使用
    • 4.一维数组在内存中的存储
  • 三、二维数组
    • 1.二维数组的创建
    • 2. 二维数组的初始化
    • 3. 二维数组的使用
    • 4.二维数组在内存中的存储


前言

一、数组的概念(数组是一组相同类型元素的集合)
二~三、一维数组和二维数组的创建和初始化,以及如何使用数组下标访问和使用数组,还讨论了一维数组和二维数组在内存中是如何存储的


一、数组的概念

数组是一组相同类型元素的集合,展开来讲就是:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

二、一维数组

1.一维数组的创建

一维数组创建的基本语法如下:

type arr_name[常量值];

存放在数组中的数据被称为数组的元素,数组在创建的时候要指定数组的大小和数组的元素类型。
• type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型。
• arr_name 指的是数组的名字,这个名字根据实际情况,起的有意义就行。
• [ ] 中的常量值是用来指定数组的大小的,这个数组的大小根据实际的需求指定就行。

我们可以根据需要创建不同类型和大小的数组:

int age[20];
char ch[8];
double score[10];

2.一维数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为数组初始化。
那数组如何初始化呢?数组的初始化⼀般使用大括号,将数据放在大括号中。

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    int arr[5] = {1,2,3,4,5}; 

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr[5] = {1,2}; //前两个元素初始化为1和2,剩余的元素默认初始化为0
    char ch[5] = {'a','b'}; //前两个元素初始化为'a'和'b',剩余的元素默认初始化为'\0'

(3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
                int arr[5] = {1,2,3,4,5}; 
     也可以写成:int arr[] = {1,2,3,4,5};  
     //虽然没有在方括号中指定数组的大小,但是系统会根据花括号中数据的个数来确定数组的大小

3. 一维数组的使用

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

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

在这里插入图片描述

在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]);//8
	printf("%d\n", arr[3]);//4
	return 0;
}

在这里插入图片描述

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;
}

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

三、二维数组

1.二维数组的创建

二维数组创建的基本语法如下

type arr_name[常量值1][常量值2];

举例说明:

int arr[3][5];

• 3表示数组有3行
• 5表示每⼀行有5个元素
• int 表示数组中的每个元素是整型类型

2. 二维数组的初始化

在创建数组的时候,给定⼀些初始值,被称为数组初始化。
那二维数组如何初始化呢?像一维数组一样,也是使用大括号初始化的。

(1)完全初始化:在定义数组时对全部数组元素赋予初值
    int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7}; //可以将所有数据写在一个花括号内来对数组进行初始化
    int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; //也可以将数据放在几个花括号内分行来对数组进行初始化

在这里插入图片描述

(2)不完全初始化:在定义数组时只给一部分数组元素赋予初值
    int arr1[3][5] = {1,2,3,4,5,6}; //前6个元素初始化为1~6,剩余的元素默认初始化为0
    int arr2[3][5] = {{1,2},{3,4},{5,6}}; //初始化了每一行的前两个元素,每一行剩余的元素默认初始化为0

在这里插入图片描述

(3)在对二维数组元素赋初值时,可以省略行数,但不能省略列数(每一行的元素个数)。如下:
   int arr1[][5] = {1,2,3,4,5,6};
   int arr2[][5] = {1,2,3,4,5,6,7,8,9,10,11};
   //系统会根据赋初值的元素个数和列数来确定二维数组的行数

在这里插入图片描述

3. 二维数组的使用

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

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

在这里插入图片描述

行号和列号都是从0开始的,只要确定了行和列就能唯⼀锁定数组中的⼀个元素,比如,我们说:第0行,第0列,快速就能定位出1;第2行,第4列,就能定位出7。 如下代码:

#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\n", arr[0][0]);//1
	printf("%d\n", arr[2][4]);//7
	return 0;
}

在这里插入图片描述

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

像⼀维数组⼀样,我们如果想研究二维数组在内存中的存储方式,也是可以打印出数组所有元素的地址的。代码如下:

#include <stdio.h>

int main()
{
	int arr[3][5] = { 123456789101112131415 };
	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;
}

在这里插入图片描述
从输出的结果来看,每⼀行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的
如下图所示:

在这里插入图片描述


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

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

相关文章

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下&#xff0c;加快产品开发周期&#xff0c;成为许多企业亟待解决的问题。六西格玛中的DFSS&#xff08;Design for Six Sigma&#xff09;模型提供了一种系统的方法&a…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机&#xff1a; 用户截屏&#xff0c;被禁用 用户录屏&#xff0c;录制的是空白内容/黑色内容的视频。 二、微信小…

RS-FS-N01风速变送器简明教程(485通信类型变送器)

该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 文章主要介绍变送器的硬件连接、软件配置、数据读写以温湿度计算。 1 硬件连接 2 软件配置 将变送器硬件部分正确连接后 打开“485 参数配置工具.exe” 对风速…

hello树先生——红黑树

红黑树 一.什么是红黑树二.红黑树的实现1.创建树节点结构2.插入功能的实现 三.提供一些常见二叉树接口四.进行平衡测试 一.什么是红黑树 红黑树是一种自平衡的二叉搜索树&#xff0c;具有以下特性&#xff1a; 节点颜色&#xff1a;每个节点要么是红色&#xff0c;要么是黑色。…

从模型到实践:新时代【数学建模竞赛论文】的结构、规范与创新解析

目录 1. 数学建模竞赛论文的重要作用 1.1 论文是竞赛成果的书面形式 1.2 论文是评判参赛成绩的唯一依据 1.3 论文写作是科技论文写作的基本训练 1.4 数学建模竞赛论文的综合性 1.5 数学建模竞赛论文与学术研究的联系 1.6 数学建模竞赛论文的重要性在评委眼中 1.7 数学建…

Leetcode3248. 矩阵中的蛇

Every day a Leetcode 题目来源&#xff1a;3248. 矩阵中的蛇 解法1&#xff1a;模拟 遍历字符串数组 commands&#xff0c;模拟&#x1f40d;的移动过程。 如果最后&#x1f40d;的位置为 (i, j)&#xff0c;则编号为 (i * n) j。 代码&#xff1a; /** lc appleetcode…

[Hive]五、Hive 源码编译

G:\Bigdata\2.hive\大数据技术之Hive源码编译 第1章 部署Hadoop和Hive 1.1 版本测试 Hadoop3.3.6 和Hive3.1.3 运行hive客户端时报错: java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V 查看Ha…

计算机的错误计算(八十一)

摘要 讨论双曲正弦函数 sinh(x)的计算精度问题。 例1. 计算 sinh(312.08) . 若在Python下计算&#xff0c;则有&#xff1a; 若在Excel单元格中计算&#xff0c;则有&#xff1a; 事实上&#xff0c;16位的正确值是 0.1712347549914620e136&#xff08;ISRealsoft 提供&…

MLLM(一)| 文/图生视频任务大升级,BigModel 开源了视频模型CogVideoX

CogVideoX的体验地址&#xff1a;https://bigmodel.cn/console/trialcenter?modelCodecogvideox 自2021年起&#xff0c;智谱 AI 技术团队便开始着手布局包括 text-2-img、text-2-video、img-2-text、video-2-text 在内的多模态模型&#xff0c;并陆续研发并开源了CogView、Co…

0基础学习爬虫系列:Python环境搭建

1.背景 当前网络资源更新非常快&#xff0c;然后对应自己感兴趣的内容&#xff0c;每天盯着刷网站又太费时间。我在尝试借助Ai&#xff0c;搭建一套自己知识抓取更新提醒的系统&#xff0c;这样可以用极少的时间&#xff0c;关注到自己感兴趣的信息。 其实&#xff0c;这套逻辑…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中&#xff0c;C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息&#xff0c;可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”&#xff08;/FC&#xff09;选项…

幂等的通用实现方案

文章目录 一、幂等的概念1.1 什么是幂等1.2 举个例子 二、幂等问题的解决方案2.1 准备&#xff1a;先添加2张表&#xff08;账户表、充值订单表&#xff09;2.2 方案1&#xff1a;update时将status0作为条件判断解决原理源码 2.3 方案2&#xff1a;乐观锁原理源码 2.4 方案3&am…

FMCW雷达介绍以及FMCW雷达测距

调频连续波雷达测距 FMCW radar: Frequency Modulated Continous Wave信号表示形式 调频连续波形式&#xff08;频域/时域&#xff09; 发射信号和接收信号 数学表达式 测距模型 该文章详细介绍了单target和多target场景下的FMCW雷达测距&#xff01;&#xff01;&#xff01;…

Datawhale X 李宏毅苹果书 AI夏令营 Task3打卡

实践方法论 1 模型偏差 1.1 基本概念 模型偏差&#xff08;Model Bias&#xff09;&#xff0c;也称为“偏差误差”或“系统误差”&#xff0c;是指模型预测值与真实值之间的差异&#xff0c;这种差异并不是由随机误差引起的&#xff0c;而是由模型本身的结构或假设导致的。模…

如何在 Raspberry Pi 5 上设置 Raspberry Pi AI Kit

本指南将帮助您在 Raspberry Pi 5 上安装 Raspberry Pi AI Kit。这将使您能够使用 Hailo AI 神经网络加速器运行 rpicam-apps 摄像头演示。 如果您在开始安装人工智能套件之前需要帮助&#xff0c;本指南提供了安装过程的分步图片。 安装人工智能套件&#xff1a;https://www.…

SGM41511电源管理芯片与STM32L496通讯源码虚拟I2C协议实测成功读写cubemx设置裸机和freertos操作系统源码通用

不用它的I2C设置&#xff0c;容易出错不通讯&#xff0c;只打开GPIO输出就可以&#xff1b; 如果是RTOS的话请打开系统定时器提供参考时间基准&#xff0c;那个定时器都行&#xff1b; 以下是经过验证的代码&#xff0c;同样适用于SGM同类系列电源管理芯片&#xff1b; 准备好…

HTML5好看的花店商城源码1

文章目录 1.设计来源1.1 主界面1.2 界面效果11.3 界面效果21.4 界面效果31.5 界面效果41.6 界面效果51.7 界面效果61.8 界面效果7 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh…

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…

9.2(C++ Day 4)

一、作业 完成算术运算符重载&#xff0c;实现至少两个运算符的成员函数和全局函数的版本 1.&#xff08;1&#xff09;成员函数实现算术运算符&#xff08;-&#xff09;重载 const 类名 operator#(const 类名 &R) const {} #include <iostream>using namespac…

三级_网络技术_56_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)在不改变路由表项的前提下&…