数组知识初阶

2023-10-27

   思维导图:

目录

   思维导图:

1.一维数组 

1.1一维数组的创建:

1.2一维数组的初始化

1.3一维数组的使用

1.4一维数组在内存中的存储

2.二维数组 

2.1二维数组的创建与初始化

2.3二维数组的使用

2.4二维数组的存储:

3.数组越界 

4.数组作为函数参数 

4.1两个例外:

5.两个应用实例

扫雷:

三子棋:


1.一维数组 

1.1一维数组的创建:

一维数组是相同类型的一组数的集合。创建方法:

type_t arr_name [const n]

//type_t是数组类型

//arr_name是数组的名字

//const n 是常量

1.2一维数组的初始化

内涵:在创建数组时对数组内容进行合理赋值

初始化:

int arr[100]={0};//100个元素都是0
int arr[]={0};//数组大小不确定,其数组内放的元素都是零
char arr[100]={a,b,c,d};//如果是这样初始化则其它的元素是字符0

区分两种对字符数组的初始化:

#include<stdio.h>
int main() {
	char arr[] = "abc";
	printf("%s\n", arr);
	char arr1[3] = { 'a','b','c' };
	printf("%s", arr1);
}

结果:

 为什么第二种结果呢?我们来调试看看:

通过对比,不难看出数组arr比arr1多了一个'\0'。也就是这个‘\0’使得打印结果不一样。 数组arr1中没有‘\0'所以打印完a,b,c时不会停止,直到遇到’\0'才能停止。所以它就打印了一些不可预测的值。

如果将arr[ ]改为arr[3]结果也会不可预测:

int main() {
	char arr[3] = "abc";
	printf("%s", arr);}

结果:

调试:

也是因为没有‘\0'. 

1.3一维数组的使用

int main() {//[]是下标引用符号
	int arr[] = { 0 };//一维数组可以不指定数组大小
	//数组不完全初始化
	int arr1[10] = { 0 };
	//计算元素个数
	int nums = sizeof(arr) / sizeof(arr[0]);
	//用下标对数组进行访问,下标从零开始
	for (int i = 0;i < nums;i++) {
		printf("%d", arr[i]);//对数组元素依次进行打印。
	}

	return 0;
}

总结:

1.数组的访问从零开始

2.数组大小可以通过计算得出

1.4一维数组在内存中的存储

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

	return 0;
}

从数组内的元素存储情况可以看出数组内元素的地址都差了4个字节,4个字节也就是一个整型变量的大小,从这里可以认为数组的元素之间是并列排放的。

就像这样:

2.二维数组 

2.1二维数组的创建与初始化

创建;

int main(){
	int arr1[3][4];//整型数组
	char arr2[3][4];//字符型数组
	float  arr3[3][4];//浮点型数组
	return 0;
}

初始化:

int main() {
	int arr1[3][4] = { 1,2,3,4 };
	int arr2[3][4] = { {1,2},{3,4} };
	int arr3[][4] = { 1,2,3,4 };//行可以省,列不能省
	int arr4[][4] = { {1,2},{3,4} };
	return 0;
}

2.3二维数组的使用

二维数组的使用也是通过下标的方式:

int main() {
	int arr[3][4] = { 1,2,3,4,5,6 };
	int i = 0;
	int j = 0;
	for (i = 0;i < 3;i++) {//双层循环的方式进行使用
		for (j = 0;j < 4;j++) {
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

2.4二维数组的存储:

先说结论:二维数组也是并列放的。

看看内存情况:

和一维数组一样,相邻元素之间的地址差4,所以二维数组的存放也是并列存储的。

3.数组越界 

数组的下标是从零开始的,最后一个元素的下标是(n-1)。数组的大小是有限制的,所以数组的下标访问有可能越界。但是当数组越界时编译器是不报错的,因此我们在玩数组时要时刻检查数组的大小是否越界从而避免一些bug。如下面这个数组,越界但不报错:

4.数组作为函数参数 

有时候,我们用一个函数来实现对一个数组进行排序时,我们就要将数组作为一个实际参数传进函数内。就像实现一个冒泡排序算法一样:

void bubble_sort(int arr[], int len) {
	int i = 0;
	int j = 0;
	for (i = 0;i < len - 1;i++) {
		for (j = 0;j < len - 1 - i;j++) {
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = temp;

			}
		}
	}
}
int main() {
	int arr[10] = { 2,6,7,9,4,55,66,33,44,88 };
	int len = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
	bubble_sort(arr, len);//用一个冒泡排序函数实现从小到大排序
	for (int i = 0;i < len;i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

结果也是没有问题的:

但是函数里面的形参arr[]接收的是什么呢?是整一个元素还是数组的首元素地址呢?我们可以调试着看看,好吧,我不会调试,直接告诉你这里的形参接收的是数组的首元素地址。

在这里,如果将len放到函数里面去算,就会出问题。比如这样:

在这里可以看看len的大小:

在这里len的大小变成了1,也可以印证arr接收的是 数组的首元素地址。

4.1两个例外:

以下两种情况arr代表的是整个数组:

1.sizeof(arr)//sizeof()在操作符内。

2.为&arr这种形式时。

5.两个应用实例

扫雷:

http://t.csdn.cn/Tm7XN

三子棋:

http://t.csdn.cn/vKwRM

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组知识初阶 的相关文章

  • jitter概念理解

    一般 PLL等时钟产生模块 都会有RMS jitter的描述 根据这个参数 可以计算出相关时钟的clock jitter 方便设置综合sdc的时钟约束 为什么只有RMS jitter 因为期望值就是理论周期值 根据期望值 RMS 均方差 就
  • 数据运营-计算留存率和转化率(漏斗分析&Python)

    一 案例数据 在数据运营中 留存率分析和转化率 漏斗 分析是经常用到的 本文结合具体案例总结了如何利用python求n日留存率以及各环节间转化率 指标释义 案例数据集介绍 本文是利用淘宝app的运营数据进行分析的 数据集中包含以下字段 部分
  • vue项目+el-tree,树结构展示,非常完整的代码,包含调接口拿真实数据渲染

    温故而知新 最近项目中频繁使用树形结构展示效果 因为不熟悉 备受折磨 代码贴出来 再复习一次 代码太长了 想看分析的可以搜我下一篇文章 下一篇会详细的写如何在项目中使用 效果 左侧是树 右侧是表格 点击任何一行都会展示对应的表格 完整代码如
  • Acwing 898. 数字三角形

    f i j 表示所有从起点开始 走到 i j 的路径中的和的最大值 自上而下到达 i j 有两种路径 一个是左上方 一个是正上方 f i j max f i 1 j 1 a i j f i 1 j a i j 注意边界情况 边界初始化为 I
  • 单机网游架设必学:Win7安装虚拟机详细步骤

    1 下载虚拟机软件 VMware VMware Workstation 中文正式版 10 0 1 137977 2 查了很多资料说虚拟机不会占用磁盘 但是我感觉应该是有影响的 所以这里我特意分出来一个空白的60G盘做测试用 分盘用 Acro
  • PDB文件详解

    PDB文件的介绍 PDB Program Data Base 意即程序的基本数据 是VS编译链接时生成的文件 DPB文件主要存储了VS调试程序时所需要的基本信息 主要包括源文件名 变量名 函数名 FPO 帧指针 对应的行号等等 因为存储的是
  • 强化学习算法 DQN 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 强化学习算法 DQN 解决 CartPole 问题 移动小车使得车上的摆杆保持直立 这个游戏环境可以说是强化学习中的 Hello World 大

随机推荐

  • Visual C++ ADO数据库编程入门(1)

    ADO 是目前在Windows环境中比较流行的客户端数据库编程技术 ADO是建立在OLE DB底层技术之上的高级编程接口 因而它兼具有强大的数据处理功能 处理各种不同类型的数据源 分布式的数据处理等等 和极其简单 易用的编程接口 因而得到了
  • 分布式系统详解--框架(Hadoop--RPC协议)

    分布式系统详解 框架 Hadoop RPC协议 在之前的一篇文章当中已经写过一篇文章是关于RPC通信协议的文章 是 分布式系统详解 基础知识 通信 是讲的关于网络通信的最基本的知识 这篇文章也简单讲一下关于hadoop内部的网络通信 一 h
  • 蓝桥杯第四届题目答案

    蓝桥杯第四届省赛javaB组题目答案 第一题 标题 世纪末的星期 曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不
  • android instrumentation 原理,理解 android instrumentation

    instrumentation 先看activity的启动过程 Override public void startActivity Intent intent Nullable Bundle options if options null
  • pyqt拖拽获取文件路径

    main py import sys import PyQt5 QtWidgets as qw from mainwindow import Ui MainWindow class TestWindow qw QMainWindow def
  • [UE4]C++中SpawnActor用法(动态创建Actor)

    注 这里创建actor跟unity有明显不同 ue不能创建一个单独的actor 单独的actor也没意义 ue里的actor是用来继承的 这里创建的actor都是实例化actor的子类 细想下 并不影响动态创建对象 ue417用下面的写法貌
  • 【LINUX】i.MX6学习笔记(1) 调试环境搭建(MfgTool) + 学习资料(正点原子 + 韦东山)

    1 引言 说起来 和linux打交道也挺久了 最近3年的主要工作都是在linux下做的应用层开发 在做应用层之前 因为做控制算法的原因 很多东西又是在单片机或者DSP上跑的裸核 二者一合并 中间就出现了一个巨大的断层 就是Linux 驱动
  • [jdbc]DAO及相关实现类

    DAO及相关实现类 DAO BaseDAO java CustomerDAO java CustomerDAOImpl java 测试CustomerDAOImplTest 升级版就是把Customer class 去掉 具体没写 再jdb
  • 数据库之表格(一): 建表-备份-恢复【SQL-Server】

    不求点赞 只求耐心看完 指出您的疑惑和写的不好的地方 谢谢您 本人会及时更正感谢 希望看完后能帮助您理解算法的本质 目录 一 操作一 建立表格 二 操作二 备份表格 三 操作三 恢复导入表格 一 操作一 建立表格 可以都设为 c h a r
  • 静态综合实验

    对未来的真正慷慨 是把一切都献给现在 阿尔贝 加缪 反抗者 静态综合实验 让我们来看看实验的样子 IP地址划分 R3下方电脑DHCP获取IP地址 路由表要尽量小 就要写缺省路由 缺省路由方向要相同 否则出现路由环路 但是缺省路由不能代表所有
  • 光纤通信技术

    目录 1 绪论 2 光纤和光缆 2 1 光纤 1 阶跃型光纤 2 渐变型光纤 3 波动光学分析 4 光纤的基本特性 2 2 光缆 3 光源和光发射机 3 1 光电器件的一般工作原理 3 2 发光二极管 LED 3 3 半导体激光器 LD 3
  • Java集合基础知识必会(一)

    Java集合基础知识 一 Java集合是Java中一种非常重要的数据结构 它提供了一种方便而高效的方式来存储和处理数据 本文将介绍Java集合的基础知识 包括集合框架的概述 常见的集合接口和实现类 以及一些使用案例 集合框架概述 Java集
  • OpenCV 变换整幅图像的warpPerspective()函数——中心化坐标表示

    OpenCV自带的warpPerspective 函数 可以根据透视变换参数实现从一幅图像到另外一幅图像之间的映射变换 OpenCV为了保证坐标的对应关系 在一些情况下 会对变换的图像进行裁剪 以至于不能显示图像全貌 如图1所示 这限制了其
  • A. 运维体系 --- SLA理论体系

    A 运维体系 SLA理论体系 概述 SLA 是服务供应商与客户之间的服务等级协议 它定义了服务供应商应保证的服务质量 以及在服务不达标情况下的服务赔偿 SLA在定义上又细分为SLI SLO与SLA SLI 服务质量指标 服务的某项质量的一个
  • Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    1 将一个文件夹下的所有内容复制到另一个文件夹下 cp r home packageA home cp packageB 或 cp r home packageA home cp packageB 这两种方法效果是一样的 方法示例 2 将一
  • 201809-3元素选择器

    题目链接 题目描述 样例输入 11 5 html head title body h1 p subtitle div main h2 p none div p two p subtitle h3 div p div div p 样例输出 3
  • 适用于Windows的Xcode:在PC上安装Xcode的5种方法

    适用于Windows的Xcode 在PC上安装Xcode的5种方法 您的目标是开发iOS应用程序但是您没有可以支持Apple操作系统的计算机吗 您不必担心 因为您可以在Windows计算机上运行Xcode Xcode是一个值得信赖的macO
  • JavaWeb----SSM框架简单的搭建和使用---2021-07-22

    一 先对SSM矿建做个简单的介绍 大概先了解这是做啥的有啥用 下面是详细到每一步的保姆级教程 SSM简介 SSM Spring SpringMVC MyBatis 框架集由Spring MyBatis两个开源框架整合而成 SpringMVC
  • 从0到1搭建个人博客-Django(三)

    你好 我是goldsunC 让我们一起进步吧 从0到1搭建个人博客 Django 三 在以下链接快速回顾系列文章内容 从0到1搭建个人博客 Django 一 从0到1搭建个人博客 Django 二 本篇内容主要是一些框架概念性的东西 需要理
  • 数组知识初阶

    思维导图 目录 思维导图 1 一维数组 1 1一维数组的创建 1 2一维数组的初始化 1 3一维数组的使用 1 4一维数组在内存中的存储 2 二维数组 2 1二维数组的创建与初始化 2 3二维数组的使用 2 4二维数组的存储 3 数组越界