C 程序设计教程(18)—— 数组和指针(一):数组

news2024/11/27 5:46:45

C 程序设计教程(18)—— 数组和指针(一):数组

在这里插入图片描述

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(18)—— 数组和指针(一):数组
    • 一、一维数组
        • 1、一维数组的定义
        • 2、一维数组的初始化
        • 3、一维数组的应用举例
    • 二、二维数组
        • 1、二维数组的定义
        • 2、二维数组的初始化
        • 3、二维数组的应用举例

一、一维数组

数组是一个由若干同类型变量组成的集合。数组由连续的存储单元组成,最低地址对应数组的第一个元素,最高地址对应数组的最后一个元素,数组可以是一维数组,也可以是多维数组。

1、一维数组的定义

在 C 语言中,数组必须显示定义,以便编译程序为它们分配存储空间。一维数组的定义形式如下:

类型 name[size];

说明:类型说明指明数组的类型,也就是数组中每一个元素的数据类型。

数组元素是组成数组的基本单元。数组元素也是一种变量,数组元素的一般形式如下:

数据名[下标]

其中:下标只能为整型常量或整型表达式,下标表示元素在数组中的序号。例如:

int i=1,j=1;
int a[10];
a[5]=10;
a[i+j]=8;
a[i++]=6;

数组元素也称为下标变量。

例如:输入 5 个数,求其平局值。程序如下:

#include<stdio.h>
int main() 
{
	int i;
	float a[5],sum=0;
	for(i=0;i<5;i++){
		printf("请输入第%d个数值:",i+1);
		scanf("%f",&a[i]);
		sum+=a[i];
	}
	printf("五个数的平均值为:%f",sum/5);
}

以上程序的运行结果如下:

在这里插入图片描述

说明:

(1)对变量的任何操作都适合于数组元素,因为数据元素本身等价于同一数据类型的变量。

(2)在定义数组时,下标不能使用变量,但在引用数组元素时下标可以使用变量。

(3)引用数组元素时下标不能超出范围。

2、一维数组的初始化

数组的初始化是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的,可以减少运行时间,提高效率。数组初始化的一般形式为:

类型说明符 数组名[常量表达式]={1,2, ..., 值n};

数组初始化可以采用以下几种形式:

(1)对所有数组元素赋值

例如:

int a[10]={,1,2,3,4,5,6,7,8,9,10};

(2)给部分数组元素赋值

例如:

int a[10]={1,2,3,4};

给前 4 个数组元素赋值,后 6 个数组元素的值为 0。

(3)如果使一个数组全部的数组元素值为 0,可以使用如下格式:

int a[10]={0};

如果定义一个全局数组或静态数组,并且没有进行初始化,系统自动将所有数组元素赋值为 0。

(4)在对全部数组元素赋值时,可以不指定数组的长度,系统会自动计算长度。

例如:

int a[]={1,2,3,4,5};
//等价于
int a[5]={1,2,3,4,5};

3、一维数组的应用举例

(1)输出斐波那契(Fibonacci)数列的前 20 项

斐波那契数列有如下规律:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)。

程序如下:

#include<stdio.h>
int main() 
{
	int a[20]={1,1},i;
	printf("%10d%10d",a[0],a[1]);
	for(i=2;i<20;i++){
		if(i%5==0){
			printf("\n");
		}
		a[i]=a[i-1]+a[i-2];
		printf("%10d",a[i]);
	}
}

以上程序的运行结果如下:

在这里插入图片描述

(2)输入10 个整数存入数组,求最大值

程序如下:

#include<stdio.h>
int main() 
{
	int a[10],i,max;
	for(i=0;i<10;i++){
		printf("请输入第%d个整数:",i+1);
		scanf("%d",&a[i]);
	}
	max=a[0];
	for(i=1;i<10;i++){
		if (max<a[i]){
			max=a[i];
		}
	}
	printf("10个整数中的最大值为:%d",max);
}

以上程序的运行结果如下:

在这里插入图片描述

二、二维数组

1、二维数组的定义

二维数组是以一维数组为元素构成的数组,定义形式如下:

类型 数组名[size1][size2];

二维数组在逻辑上是二维的,即下标在两个方向上变化,数组元素在数组中的位置也处于一个平面之中。但是,实际的硬件存储器确实连续输入的,也就是说存储单元是按一维(线性)排列的。

二维数组在内存中的存储方式有两种:一种是按行排列,即放完一行之后顺次放入第二行;另一种是按列排列,即放完一列之后再顺次放入第二列。在 C 语言中,二维数组是按行排列的。

二维数组可以看成一个一维数组,其中的每一个元素又是一个一维数组。例如:数据 a[3][4] 可以看成一个一维数组,它有 3 个元素:a[0]、a[1]、a[2],每个元素又是一个包含 4 个元素的一维数组。例如元素 a[0] 有 4 个元素:a[0][0]、a[0][1]、a[0][2]、a[0][3]。

2、二维数组的初始化

二维数组的初始化也是在数组定义时给各数组元素赋予初值。二维数组的初始化有以下几种形式:

(1)按行分段赋值

int a[3][5]={{33,44,55,66,77},{12,13,14,15,16},{101,102,103,104,105}};

(2)按行连续赋值

#include<stdio.h>
int main() 
{
	int a[3][5]={33,44,55,66,77,12,13,14,15,16,101,102,103,104,105};
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<5;j++){
			printf("%8d",a[i][j]);
		}
		printf("\n");
	}
}

以上程序的运行结果如下:

在这里插入图片描述

(3)可以只对部分元素赋初值,为赋值的元素自动取值为 0

例如:

int a[3][3]={{1},{2},{3}};
//对每一行的第一个元素赋值,赋值的结果为
1  0  0
2  0  0
3  0  0

(4)如对全部元素赋初值,则第一维的长度可以不给出

例如:

int a[3][3]={1,2,3,4,5,6,7,8,9};
//可以写成以下格式
int a[][3]={1,2,3,4,5,6,7,8,9};

3、二维数组的应用举例

(1)一个学习小组有 5 位同学,每人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。成绩如下:

平均成绩
数学806159857672
C 语言756563877773
数据库927170908582

程序如下:

#include<stdio.h>
int main() 
{
	int a[3][5]={{80,61,59,85,76},{75,65,63,87,77},{92,71,70,90,85}};
	float v1[3]={0},avg=0;
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<5;j++){
			v1[i]+=a[i][j];
		}
		v1[i]/=5;
	}
	printf("数学平均分为:%f\n",v1[0]);
	printf("C语言平均分为:%f\n",v1[1]);
	printf("数据库平均分为:%f\n",v1[2]);
	printf("各科总平均分为:%f\n",(v1[0]+v1[1]+v1[2])/3);
}

以上程序的运行结果如下:

在这里插入图片描述

(2)有一个矩阵,编写程序求出其中元素的最大值,以及其所在的行号和列号。

程序如下:

#include<stdio.h>
int main() 
{
	int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
	int i,j,max=a[0][0],row=0,col=0;
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			if (max<a[i][j]){
				max=a[i][j];
				row=i;
				col=j;
			}
		}
	}
	printf("元素的最大值为:%d\n",max);
	printf("该元素位于第%d行第%d列。",row,col);
}

以上程序的运行结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringCloud复习巩固】微服务+Eureka+Ribbon

文章中需要用到的代码和sql 链接&#xff1a;https://pan.baidu.com/s/1_1Qqro7wR5zi7Ds8Bgmf-g 提取码&#xff1a;vxzg 目录 一.微服务 1.1单体架构 1.2分布式架构 1.3微服务 1.4各自特点总结 1.5微服务技术对比 二.服务拆分及远程调用 三.Eureka注册中心 3.1服务调用…

KVM虚拟化之小型虚拟机kvmtool的使用

根据 kvmtool github仓库文档的描述&#xff0c;类似于QEMU&#xff0c;kvmtool是一个承载KVM Guest OS的 host os用户态虚拟机&#xff0c;作为一个纯的完全虚拟化的工具&#xff0c;它不需要修改guest os即可运行, 不过&#xff0c;由于KVM基于CPU的硬件虚拟化支持&#xff0…

【JavaGuide面试总结】Java集合篇·上

【JavaGuide面试总结】Java集合篇上1.简单说说Java集合框架体系Collection接口Map接口2.说说 List, Set, Queue, Map 四者的区别&#xff1f;3.你在编程时如何选用集合?4.Collection 子接口之 ListArrayList 和 Vector 的区别?ArrayList 与 LinkedList 区别?说一说 ArrayLis…

ISIS特性与配置实例(DU比特、OL置位、Tag等)

2.3.0 ISIS基础命令与查询命令介绍、ISIS特性、ISIS与OSPF 本文章以ISIS的特性结合ISIS配置实例进行讲述&#xff0c;故篇幅会非常之大&#xff0c;建议电脑端上结合目录观看以免影响观感。 目录路由渗透配置路由渗透实例一、配置设备IP地址二、配置ISIS三、检查ISIS&#xff0…

ProGet 22.0 Enterprise Crack by Xacker

ProGet将所有包和 Docker 容器放在一个地方&#xff0c;扫描漏洞&#xff0c;并控制谁可以访问不同的提要。ProGet 可在数分钟内完成安装&#xff0c;并且拥有功能强大的免费版本&#xff0c;其中包含许多您可以在准备就绪后进行升级的强大功能。 特色用例 私人 NuGet 服务器 …

Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0

Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0 启动Springboot项目时候报错 java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Maven/apache-maven-3.6.3/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/o…

Linux动静态库

目录 一、库的概念与类型 二、库的组成文件(.o) 2.1 初始源代码(.c .h) 2.2 可重定位二进制文件(.o) 2.3 库文件(lib) 与 头文件(.h&#xff09; 三、实现静态库(.a) 3.1 建立静态库文件 3.2 交付库 3.3 编译器在编译链接中的作用 3.4 使用第三方静态库与头文件 3.…

JavaScript的引入方式和基础语法~

JavaScript简介&#xff1a; JavaScript是一门跨平台&#xff0c;面向对象的脚本语言&#xff0c;来控制网页行为的&#xff0c;它能使网页可交互 W3C标准&#xff1a;网页主要由三部分组成 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;JavaScriptJavaScript…

大数据技术架构(组件)8——Hive:Function Cases UDF/UDTF/UDAF 1

1.3、Function Cases1.3.1、窗口函数row_number&#xff1a;使用频率 ★★★★★rank &#xff1a;使用频率 ★★★★dense_rank&#xff1a;使用频率 ★★★★rank/dense_rank/row_number对比first_value&#xff1a;使用频率 ★★★last_value&#xff1a;使用频率 ★lead&am…

下班前几分钟,我彻底弄懂了并查集

目录一、并查集的由来二、代表元法2.1 初始化2.2 查询2.3 合并2.4 设计理念三、并查集的应用3.1 合并集合3.2 连通块中点的数量3.3 亲戚3.4 省份数量References一、并查集的由来 考虑这样一个场景。 现有 nnn 个元素&#xff0c;编号分别为 1,2,⋯,n1,2,\cdots,n1,2,⋯,n&…

【JVM】详解直接内存

文章目录1. 直接内存概述2. 直接内存的使用2.1 Java缓冲区2.2 直接内存3. 直接内存的释放3.1 直接内存释放原理4. 禁用显式回收对直接内存的影响1. 直接内存概述 下面是 《深入理解 Java 虚拟机 第三版》2.2.7 小节 关于 Java 直接内存的描述。 直接内存&#xff08;Direct Me…

从零开始的数模(七)层次分析法

一、概念 1.1定义 应用场景&#xff1a; 1、最佳方案选取 2、评价类问题 3、指标体系的优选 步骤&#xff1a; 1、建立层次结构模型&#xff1b; 2、构造判断(成对比较)矩阵&#xff1b; 3、层次单排序及其一致性检验&#xff1b; 4、层次总排序及其一致性检验&#xff1b; …

Mybatis 分页插件使用

1、分页插件的使用步骤 需求分析&#xff1a; 我们在前端界面获取用户表的时候&#xff0c;在界面上一次显示出成百上千条数据&#xff0c;用户体验&#xff0c;软件性能都会很糟糕&#xff0c;假设数据库内存储十万条记录&#xff0c;后端一次性返回这么多数据&#xff0c;前…

C语言深度解剖-关键字(2)

目录 1.关键字 static 源文件与头文件 static修饰全局变量 static修饰局部变量 写在最后&#xff1a; 1.关键字 static 源文件与头文件 平时我们在练习的时候&#xff0c;都只会开一个用来测试的源文件&#xff0c; 但是&#xff0c;当我们在写一个项目的时候&#xff…

Hal GPIO控制--LED/Delay实现

环境配置在CubeMx Pinout view 中点击可以设置管脚模式 &#xff0c;右击 可以配置管脚名称这里以点PB8灯为例&#xff0c;可以设置灯输出电平 &#xff0c;模式为输出&#xff0c;不进行上下拉&#xff0c; 速度 模式设置以及用户自定义名称。。时钟树配置&#xff0c;使用HSI…

FreeRTOS源码获取-->FreeRTOS移植-->FreeRTOS源码文件了解 | FreeRTOS二

目录 说明&#xff1a; 一、获取源码 1.1、FreeRTOS官网获取 1.2、正点原子开发板A盘资料\6&#xff0c;软件资料\13&#xff0c;版本-->V10.4.6 二、移植源码 2.1、移植步骤 2.1.1、添加源码、头文件路径 2.1.2、添加FreeRTOSConfig.h文件路径 2.1.3、添加或修改相…

VisualSVN Server Enterprise 5.1.1 Crack

VisualSVN Server 提供以下主要功能。 Active Directory 单点登录 允许用户使用他们当前的 Active Directory 域凭据访问 VisualSVN Server。使用安全 Kerberos V5 或 NTLM 身份验证协议。支持双因素身份验证和智能卡。 多站点存储库复制 使用 VisualSVN 分布式文件系统 (VDF…

MySQL基础(1)—— 卸载与安装

文章目录MySQL卸载【windows】1、停止MySQL服务2、软件的卸载2.1 通过控制面板卸载软件2.2 通过360软件管家等第三方软件进行删除2.3 通过MySQL安装包提供的卸载功能卸载3、残余文件的清理4、清理注册表5、删除环境变量配置MySQL安装【windows】1、下载安装包2、安装3、配置环境…

Sharding-JDBC(六)5.1.0版本,实现按月分表、自动建表、自动刷新节点

目录1.Maven 依赖2.创建表结构3.yml 配置4.TimeShardingAlgorithm.java 分片算法类5.ShardingAlgorithmTool.java 分片工具类6.ShardingTablesLoadRunner.java 初始化缓存类7.SpringUtil.java Spring工具类8.源码测试9.测试结果10.代码地址背景&#xff1a; 项目用户数据库表量…

vscode运行C/C++程序

一、vsocde对C/C的支持 Visual Studio Code对C/C语言的支持由Microsoft C/C扩展程序提供。它使得C/C在Windows、Linux和macOS等跨平台开发成为可能。 二、安装扩展程序 打开VS Code软件选择任务栏上的扩展视图图标&#xff08;下图红色方框&#xff09;或使用快捷键(CtrlShif…