当前位置: 首页 > 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 的简单介绍和用法
  • 【Leetcode】101. 对称二叉树
  • JS 中的深拷贝与浅拷贝
  • #Java异常处理
  • Android系统模拟器绘制实现概述
  • Angular 2 DI - IoC DI - 1
  • input的行数自动增减
  • iOS 颜色设置看我就够了
  • JavaScript HTML DOM
  • laravel 用artisan创建自己的模板
  • React系列之 Redux 架构模式
  • Windows Containers 大冒险: 容器网络
  • 数据可视化之 Sankey 桑基图的实现
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • - 转 Ext2.0 form使用实例
  • 最近的计划
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Mac 上flink的安装与启动
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # centos7下FFmpeg环境部署记录
  • #define用法
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (3)nginx 配置(nginx.conf)
  • (HAL库版)freeRTOS移植STMF103
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .cfg\.dat\.mak(持续补充)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net - 类的介绍
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET中GET与SET的用法
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)