当前位置: 首页 > 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 的简单介绍和用法
  • #Java异常处理
  • [LeetCode] Wiggle Sort
  • CSS相对定位
  • es6(二):字符串的扩展
  • idea + plantuml 画流程图
  • JAVA并发编程--1.基础概念
  • Mysql5.6主从复制
  • XML已死 ?
  • 第2章 网络文档
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于使用markdown的方法(引自CSDN教程)
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单易用的leetcode开发测试工具(npm)
  • 前端学习笔记之观察者模式
  • 我建了一个叫Hello World的项目
  •  一套莫尔斯电报听写、翻译系统
  • 智能合约开发环境搭建及Hello World合约
  • 湖北分布式智能数据采集方法有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 如何在招聘中考核.NET架构师
  • ​MySQL主从复制一致性检测
  • #pragma预处理命令
  • #stm32整理(一)flash读写
  • #大学#套接字
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2020)Java后端开发----(面试题和笔试题)
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)终结任务
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)德国人的记事本
  • (转)为C# Windows服务添加安装程序
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET连接数据库方式
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @Transactional 详解
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux ] git工具的基本使用(仓库的构建,提交)