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

C语言 —— 数组

一维数组与二维数组

  • 前言
  • 一、 一维数组
    • 1.1 一维数组定义和使用
    • 1.2 例子 :列出0-9的数字
    • 1.3 一维数组的初始化
    • 1.4 数组名
  • 二、二维数组
    • 2.1 二维数组的定义
    • 2.2 例题:一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的平均分和总平均分。
    • 2.3 二维数组初始化
  • 总结


前言

数组:
相当于在程序设计中,为了方便处理数据把具有相同类型的若干变量并有序形式组织排列起来,数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。
在这里插入图片描述

一、 一维数组

1.1 一维数组定义和使用

注意事项:
1、数组名字符合标识符的书写规定(数字、英文字母、下划线)。
2、数组名不能与其它变量名相同,同一作用域内是唯一的。
3、方括号 [ ] 中常量表达式表示数组元素的个数。

int a[3]表示数组a有3个元素
其下标从0开始计算,因此3个元素分别为a[0],a[1],a[2]

定义数组时 [ ] 内最好是常量,使用数组时 [ ] 内即可是常量,也可以是变量

1.2 例子 :列出0-9的数字

代码:

#include <stdio.h>
int main()
{
	int a[10];//定义了一个数组,名字叫a,有10个成员,每个成员都是int类型
	//a[0]…… a[9],没有a[10]
	//没有a这个变量,a是数组的名字,但不是变量名,它是常量
	a[0] = 0;
	//……
	a[9] = 9;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		a[i] = i; //给数组赋值
	}

	//遍历数组,并输出每个成员的值
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述

1.3 一维数组的初始化

在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为零。局部数组若不初始化,内容为随机值。

对于数组的初始化需要注意以下几点:

  1. 可以只给部分元素赋值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。
  2. 只能给元素逐个赋值,不能给数组整体赋值
  3. 如给全部元素赋值,那么在定义数组时可以不给出数组长度
    代码例子:
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量
int a[10] = { 1, 2, 3 };//初始化前三个成员,后面所有元素都设置为0
int a[10] = { 0 };//所有的成员都设置为0
//[]中不定义元素个数,定义时必须初始化
int a[] = { 1, 2, 3, 4, 5 };//定义了一个数组,有5个成员

1.4 数组名

数组名是一个地址的常量,代表数组中首元素的地址。

代码:

#include <stdio.h>

int main()
{
	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//定义一个数组,同时初始化所有成员变量
	printf("a = %p\n", a);
	printf("&a[0] = %p\n", &a[0]);
	int n = sizeof(a); //数组占用内存的大小,10个int类型,10 * 4  = 40
	int n0 = sizeof(a[0]);//数组第0个元素占用内存大小,第0个元素为int,4
	int i = 0;
	for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

二、二维数组

2.1 二维数组的定义

二维数组定义的一般形式是:

dataType arrayName[length1][length2];

其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。

例如:

int a[3][4];

定义了一个 3 行 4 列的二维数组,共有 3×4=12 个元素,数组名为 a,即:

a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]

如果想表示第 2 行第 1 列的元素,应该写作 a[2][1]

2.2 例题:一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的平均分和总平均分。

在这里插入图片描述
代码:
对于该题目,可以定义一个二维数组 a[5][3] 存放 5 个人 3 门课的成绩,定义一个一维数组 v[3] 存放各科平均分,再定义一个变量 average 存放总平均分

#include <stdio.h>
int main(){
    int i, j;  //二维数组下标
    int sum = 0;  //当前科目的总成绩
    int average;  //总平均分
    int v[3];  //各科平均分
    int a[5][3];  //用来保存每个同学各科成绩的二维数组
    printf("Input score:\n");
    for(i=0; i<3; i++){
        for(j=0; j<5; j++){
            scanf("%d", &a[j][i]);  //输入每个同学的各科成绩
            sum += a[j][i];  //计算当前科目的总成绩
        }
        v[i]=sum/5;  // 当前科目的平均分
        sum=0;
    }
    average = (v[0] + v[1] + v[2]) / 3;
    printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
    printf("Total: %d\n", average);
    return 0;
}

2.3 二维数组初始化

二维数组的初始化可以按行分段赋值,也可按行连续赋值。

对于二维数组的初始化还要注意以下几点:

  1. 可以只对部分元素赋值,未赋值的元素自动取“零”值。
  2. 如果对全部元素赋值,那么第一维的长度可以不给出。
  3. 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。

总结

数组可以看作是一行连续的数据,只有一个下标,称为一维数组,C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置,多维数组可由二维数组类推而得到。

相关文章:

  • 35岁大龄程序员职业转型规划
  • IntelliJ IDEA 2023.1 最新变化
  • Qt音视频开发22-音频播放QAudioOutput
  • 递归--【天梯L2】愿天下有情人都是失散多年的兄妹
  • 第七章 react组件实例中三大属性之props
  • 面试官:Tomcat 在 SpringBoot 中是如何启动的(一)
  • 【人工智能与深度学习】判别性循环稀疏自编码器和群体稀疏性
  • 【计算机视觉 | 目标检测】BARON:pseudo words 和 linear layer 的理解
  • 【Git从入门到精通】分支机制
  • 【jvm系列-04】精通运行时数据区共享区域---堆
  • 【机器学习】P10 从头到尾实现一个线性回归案例
  • 四个常见的Linux面试问题
  • 【面试】TCP、UDP、Socket、HTTP网络编程面试题
  • Mysql查询截取分析_慢查询日志
  • Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法
  • AHK 中 = 和 == 等比较运算符的用法
  • co模块的前端实现
  • DOM的那些事
  • Facebook AccountKit 接入的坑点
  • Javascript基础之Array数组API
  • java多线程
  • JS基础之数据类型、对象、原型、原型链、继承
  • Sass Day-01
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 飞驰在Mesos的涡轮引擎上
  • 基于webpack 的 vue 多页架构
  • 简单实现一个textarea自适应高度
  • 简单易用的leetcode开发测试工具(npm)
  • 将 Measurements 和 Units 应用到物理学
  • 聊聊hikari连接池的leakDetectionThreshold
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 悄悄地说一个bug
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微服务入门【系列视频课程】
  • 一文看透浏览器架构
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 数据库巡检项
  • ​一些不规范的GTID使用场景
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (windows2012共享文件夹和防火墙设置
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Maven插件解析运行机制
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)认识微服务
  • (转)memcache、redis缓存
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net Redis的秒杀Dome和异步执行
  • .netcore如何运行环境安装到Linux服务器
  • .net流程开发平台的一些难点(1)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /bin/bash^M: bad interpreter: No such file or directory
  • @RequestMapping 的作用是什么?
  • @RestControllerAdvice异常统一处理类失效原因