当前位置: 首页 > news >正文

C语言数组详解

目录

  • 1. 一维数组
    • 1.1 一维数组的创建
    • 1.2 一维数组的初始化
    • 1.3 一维数组的使用
    • 1.4 一维数组在内存中的存储
  • 2. 二维数组
    • 2.1 二位数组的创建
    • 2.2 二维数组的初始化
    • 2.3 二维数组的使用
    • 2.4 二维数组在内存中的存储
  • 3. 数组越界
  • 4. 数组可以做函数参数

数组(Array)是有序的元素序列,是用于储存多个相同类型数据的集合。

1. 一维数组

1.1 一维数组的创建

创建方式:
type_t arr_name [const_n];
type_t 是指数组的元素类型。
const_n 是一个常量表达式,用来指定数组的大小。
例:int arr[10];
类型为整型、大小为十、名字为arr的数组。

:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念。
例:int count = 10;int arr[count];
该句代码先定义一个变量count,再将count作为数组的大小,但它在C99之前都不支持!并且它的长度不是想变就变的,只是你可以给count赋值,然后创建count大小的数组,大小不再是常量了。

变长数组是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。

1.2 一维数组的初始化

数组初始化:在创建数组的同时给数组赋一些初始值。

完整的初始化方式:

  • 整型数组:int arr1[5] = {1,2,3,4,5};
    字符数组:char ch[3] = {'a','b','c'};
    字符串: char str[3] = "abc";

不完整的初始化方式:

  1. 整型数组:int arr2[10] = {1,2,3,4,5};
    字符数组:char ch1[10] = {'a','b','c'};
    字符串: char str1[10] = "abc";
    若花括号内元素的个数少于方括号,那么花括号中剩余元素就会默认初始化为零。

  2. 整型数组:int arr3[] = {1,2,3,4,5};
    字符数组:char ch2[] = {'a','b','c'};
    字符串: char str2[] = "abc";
    若方括号中没有初值,那么它的初值就是花括号中元素的个数。

字符串与字符的初始化相似但有所不同,字符串初始化时会在结尾加’\0’表示结束,而字符不会,当然如果是开的空间大于字符或字符串,那么它们其实是一样的,因为反正会将剩余的空间初始化为零。
在这里插入图片描述

1.3 一维数组的使用

方括号 ’ [ ] ’ :下标引用操作符,用于数组元素的访问。
数组访问用下标,且下标从零开始

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
像这句代码,想取出元素1,由于数组下标是从零开始的,可以用arr[0]表示第一个元素。

下举个打印数组内所有元素的例子(附注释):
在这里插入图片描述

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

创建一个固定数组,它的空间开辟在栈中,并且是连续存储的。

&:取址符,取出元素地址;这样就能知道储存的位置。

我们来打印地址来观察:
此时发现一维数组的数据在内存中的确是按顺序连续存储。
在这里插入图片描述

在这里插入图片描述

2. 二维数组

2.1 二位数组的创建

创建方式:
type_t arr_name [const_n1][const_n2];
type_t 是指数组的元素类型。
const_n1是一个常量表达式,用来指定数组的行。
const_n2是一个常量表达式,用来指定数组的列。
例:int arr[3][4];
三行四列,12个元素的二维数组

2.2 二维数组的初始化

完整的初始化方式
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

不完整的初始化方式

  • 花括号内无分组
    1.int arr[3][4] = {1,2};
    只初始化第一行的前两个元素,剩余元素默认为零。
    2.int arr[3][4] = {1,2,3,4,5,6};
    只初始化第一行的元素和第二行的前两个元素,剩余元素默认为零。

  • 花括号内有分组
    int arr[3][4] = {{1,2},{3,4}};
    只初始化第一行和第二行的前两个元素,剩余元素默认为零。

  • 当有初始化,那么方括号中行数可省略
    int arr[][4] = {{1,2},{3,4}};
    但若没有初始化,像int arr[][4];,那么就是错的。

2.3 二维数组的使用

二维数组也是用‘ [ ] ’来访问,不过是分行下标和列下标。
例如:int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
想访问元素7,可以用arr[1][2]来访问。

例题:打印数组所有元素

int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完整初始化
	int i = 0;//定义行下标
	for (i = 0; i < 3;i++)
	{
		int j = 0;//定义列下标
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

2.4 二维数组在内存中的存储

我们同样来打印地址来观察:
此时发现二维数组和一维数组的数据在内存中存储是一样的,也是按顺序连续存储。
在这里插入图片描述
在这里插入图片描述

3. 数组越界

数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

例如:
一维:int arr1[5] = {1,2,3,4,5};
该数组有五个元素,下标从零开始,那么下标:0 1 2 3 4,下标>4,或<0,数组越界访问。

二维:int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
该数组有12个元素,下标从零开始,那么下标有:00、 01、 02、 03、 10、 11、 12、 13、 20、 21、 22、 23,如果行>2,列>3或下标<0,数组越界访问。

注意:
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就
是正确的,所以写代码时,最好自己做越界的检查。

在这里插入图片描述

4. 数组可以做函数参数

当函数需要一个数组时,可以将函数名作为参数传过去。
在这里插入图片描述

但是需要注意的是这里传的数组并不是将整个数组传过去,而是首元素的地址。因此sz只能在main函数中计算,然后作为参数传过去。由于数组名arr是一个地址,而地址在32位下是四个字节,arr[0]的值是1,整型也是四个字节,相比为结果为1。
数组名的解释在这篇中http://t.csdn.cn/efcOg
在这里插入图片描述

求三连支持,若有错误,敬请各位读者斧正!

相关文章:

  • DS | 冲刺阶段考点整理 —— 绪论、线性表、栈与队列、特殊矩阵、串
  • 实验5 循环结构
  • 【漏洞复现-Apache-目录穿越文件读取-RCE】vulfocus/apache(cve_2021_41773)
  • 基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数(提供matlab仿真录像)
  • 机器学习基础:拉格朗日乘子法
  • Matlab 与 Python 基于窗函数的滤波器设计对比 之 凯瑟窗
  • java web开发(从spring boot到spring cloud)
  • 看呆了!二面高德 Java 岗,问了一堆源码,微服务,分布式,Redis,心累
  • 2022华为杯研究生数学建模竞赛B题思路解析
  • 2022华为杯研究生数学建模竞赛E题思路解析
  • 【C语言】学生考勤管理系统
  • 常用的调试技巧(如何检测bug)
  • SpringBoot二十六课大纲和目录
  • 2022年中国研究生数学建模竞赛C题-汽车制造涂装-总装缓存调序区调度优化问题
  • 2022研究生数模A题——移动场景超分辨定位问题
  • CentOS7 安装JDK
  • CSS 提示工具(Tooltip)
  • express + mock 让前后台并行开发
  • Gradle 5.0 正式版发布
  • HTTP中的ETag在移动客户端的应用
  • Idea+maven+scala构建包并在spark on yarn 运行
  • js正则,这点儿就够用了
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MySQL数据库运维之数据恢复
  • Python3爬取英雄联盟英雄皮肤大图
  • Rancher-k8s加速安装文档
  • SOFAMosn配置模型
  • 程序员该如何有效的找工作?
  • 分布式事物理论与实践
  • 老板让我十分钟上手nx-admin
  • 使用 Xcode 的 Target 区分开发和生产环境
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Hibernate主键生成策略及选择
  • 阿里云服务器如何修改远程端口?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (SpringBoot)第七章:SpringBoot日志文件
  • (六)激光线扫描-三维重建
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET 解决重复提交问题
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @31省区市高考时间表来了,祝考试成功
  • @DataRedisTest测试redis从未如此丝滑
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [@Controller]4 详解@ModelAttribute
  • [22]. 括号生成
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改