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

一维数组的使用

数组是C语言中一种基本且重要的数据结构,它是由一个或多个相同数据类型的元素组成的集合。数组在内存中连续存储,这使得元素的访问非常高效。本文将详细介绍数组的定义、初始化、访问方式、内存布局以及常用操作,帮助你全面掌握数组的使用。

一、数组的特点

  • 数据类型相同:数组中的所有元素必须是相同的数据类型(如int、char、float等)。
  • 内存连续:数组元素在内存中是连续存放的,可以通过下标快速定位。
  • 长度固定:数组一旦定义,其长度(元素个数)在编译时确定,运行时不能改变。

二、数组的定义与格式

数组的定义格式如下:

数据类型 数组名[元素个数];

例如:

int a[5] = {2, 3, 4, 5, 6}; // 定义一个包含5个整数的数组 char b[5] = {'q', 'w', 'e', 'r', 't'}; // 定义一个包含5个字符的数组 float c[5] = {2.3, 5.1, 6.7}; // 定义一个包含5个浮点数的数组,部分初始化

三、数组的访问

数组元素通过下标访问,下标从0开始,最大下标为元素个数-1

int a[5] = {2, 3, 4, 5, 6}; printf("%d %d %d\n", a[0], a[2], a[4]); // 输出:2 4 6

重要提示:在数组定义时,方括号内的数字表示元素个数;而在其他任何情况下(如访问、赋值),方括号内的数字都表示下标

四、数组名与首地址

数组名代表数组的首地址,是一个地址常量,不能被修改(不能作为左值)。

int a[5] = {2, 3, 4, 5, 6}; printf("%p\n", a); // 输出数组首地址 printf("%p\n", &a[0]); // 输出第一个元素的地址,与上一行相同

五、数组的字节大小

数组的总字节大小 =sizeof(数据类型) × 元素个数

int a[5] = {2, 3, 4, 5, 6}; printf("%ld\n", sizeof(a)); // 输出:20 (因为 sizeof(int)=4, 4×5=20)

其他示例:

int a[5] = {1, 2, 3}; // 总字节大小:5 × 4 = 20 int b[] = {2, 3}; // 总字节大小:2 × 4 = 8(编译器自动推断元素个数为2)

六、数组的初始化

数组的初始化有以下几种方式:

  • 全部初始化:为所有元素指定初始值。
    int a[5] = {1, 2, 3, 4, 5};
  • 部分初始化:只为前几个元素指定初始值,剩余元素自动初始化为0。
    int a[5] = {1, 2}; // 数组内容:1, 2, 0, 0, 0 int b[5] = {0}; // 数组内容:0, 0, 0, 0, 0(常用清零方式)
  • 未初始化:数组元素的值是随机值(取决于内存原有内容)。
    int a[5]; // 数组元素值为随机值

七、数组的遍历与常用操作

1. 循环遍历数组

使用for循环可以方便地遍历数组:

// 整数数组的输入输出 int a[5] = {0}; for(int i = 0; i < 5; i++) { scanf("%d", &a[i]); printf("%d\n", a[i]); } // 字符数组的输入输出 char b[5] = {0}; for(int i = 0; i < 5; i++) { scanf(" %c", &b[i]); // 注意%c前的空格,用于吸收换行符 printf("%c\n", b[i]); }

2. 求数组最大值

有两种常见方法:记录最大值元素,或记录最大值下标。

// 方法一:记录最大值元素 int a[5] = {0}; for(int i = 0; i < 5; i++) scanf("%d", &a[i]); int max = a[0]; for(int i = 1; i < 5; i++) { if(max < a[i]) max = a[i]; } printf("最大值为:%d\n", max); // 方法二:记录最大值下标 int a[5] = {0}; for(int i = 0; i < 5; i++) scanf("%d", &a[i]); int max_index = 0; for(int i = 1; i < 5; i++) { if(a[max_index] < a[i]) max_index = i; } printf("最大值为:%d,是第%d个元素\n", a[max_index], max_index + 1);

八、数组的内存分配

数组元素在内存中是连续存储的,可以通过打印每个元素的地址来验证:

#include <stdio.h> int main() { int a[5] = {0}; for(int i = 0; i < 5; i++) printf("a[%d]地址:%p\n", i, &a[i]); // 地址依次递增4字节(int大小) char b[5] = {'q', 'w', 'e', 'r', 't'}; for(int i = 0; i < 5; i++) printf("b[%d]地址:%p\n", i, &b[i]); // 地址依次递增1字节(char大小) return 0; }

九、数组清零函数

1. bzero函数

头文件<strings.h>

函数原型void bzero(void *s, size_t n);

功能:将指定内存区域的前n个字节清零。

参数:s - 数组首地址,n - 要清零的字节数。

返回值:无。

#include <stdio.h> #include <strings.h> int main() { int a[5] = {2, 5, 7}; bzero(a, sizeof(a)); // 将数组a全部清零 for(int i = 0; i < 5; i++) printf("%d\n", a[i]); // 全部输出0 return 0; }

2. memset函数

头文件<string.h>

函数原型void *memset(void *s, int c, size_t n);

功能:将指定内存区域的前n个字节设置为特定值c。

参数:s - 数组首地址,c - 要设置的值,n - 要设置的字节数。

返回值:返回数组首地址。

#include <stdio.h> #include <string.h> int main() { int a[5] = {2, 5, 7}; memset(a, 0, sizeof(a)); // 将数组a全部设置为0 for(int i = 0; i < 5; i++) printf("%d\n", a[i]); // 全部输出0 return 0; }

十、字符数组与字符串

字符数组常用于存储字符串。字符串是由双引号包裹的字符序列,以'\0'(空字符)作为结束标志。

char a[6] = {"hello"}; // 正确,包含'\0',共6个字符 char a2[6] = "hello"; // 正确,简写形式 char a3[33] = "hello"; // 正确,分配33字节,实际使用6字节 char a4[] = "hello"; // 正确,编译器自动推断大小为6 char a5[] = {'h', 'e', 'l', 'l', 'o'}; // 注意:这不是字符串,没有'\0',大小为5

十一、字符串的输入输出

1. 使用%s格式符

char str[16] = {0}; scanf("%s", str); // 输入字符串(遇到空格或回车结束) printf("%s\n", str);

2. 输入包含空格的字符串

使用%[^\n]可以读取包含空格的整行输入:

char str[100] = {0}; scanf("%[^\n]", str); // 读取直到遇到换行符 printf("%s\n", str);

十二、总结

  • 数组是相同类型元素的集合,内存连续,长度固定。
  • 数组通过下标访问,下标从0开始。
  • 数组名代表首地址,是地址常量。
  • 数组大小 = sizeof(数据类型) × 元素个数。
  • 初始化方式多样,未初始化元素值为随机值。
  • 使用循环遍历数组,可进行查找、排序等操作。
  • 字符数组可存储字符串,以'\0'结束。
  • bzero和memset函数可用于数组清零。

掌握数组是学习C语言的重要基础,它为后续学习指针、结构体等高级特性打下坚实基础。建议多动手编写代码,通过实践加深理解。

http://www.jsqmd.com/news/1185063/

相关文章:

  • 2026年7月最新积家杭州未来科技城万达广场维修保养服务电话 - 积家官方售后服务中心
  • Unity技能系统开发:基于Game Creator 2的Abilities插件实战指南
  • Chowla猜想:刘维尔函数自相关与数论随机性的核心挑战
  • 使用Visual C++创建Windows快捷方式:IShellLink与IPersistFile接口详解
  • Windows环境iOS应用砸壳实战:Frida逆向QQ与淘宝完整指南
  • 2026年7月游览船企业推荐,画舫游览船/观光游览船/观光船/游船/新能源电动船/电动巡逻艇,游览船供应商哪家可靠 - 品牌推荐师
  • 2026年7月最新南宁百达翡丽官方售后热线及客户服务网点地址 - 百达翡丽服务中心
  • 2026年7月最新嘉兴帝舵官方售后服务网点地址及客服电话一览 - 帝舵中国官方服务中心
  • 21-缓存越用越脏-给本地数据加版本过期和重建策略
  • java数据类型:Long 和 long 在雪花算法ID下的陷阱
  • Java语言中的类
  • 多态与虚函数:面试官问“底层怎么实现的”,这样答直接拿满分
  • static关键字的四种用法:面试官问“static有几种用法”,90%的人答不全
  • Unity XR开发入门:从SDK导入到交互配置的完整指南
  • CSS字体样式(font)[实战指南]
  • 亲身探访广州泰格豪雅官方售后服务中心|详细网点地址与售后热线(2026年7月最新) - 亨得利官方服务中心
  • Unity BlendShape与Animation Clip实现角色动态表情完整指南
  • 2026年7月最新温州劳力士官方售后客服中心地址电话及服务网点分布 - 劳力士官方服务中心
  • 卫星视频目标跟踪:从相关滤波到深度学习的演进与挑战
  • Folium地图可视化实战:从数据到交互式地理看板
  • 宝珀手表网上预订售后保养服务指南权威公示(2026年7月最新) - 宝珀官方售后服务中心
  • Pandas数据清洗速查手册:12个高频函数实战指南
  • Gifski跨平台视频转GIF终极指南:高质量转换与自动化脚本
  • 基于C++20协程的异步网络编程:libfv框架解析与实践指南
  • YOLOv8道路坑洼检测实战:从数据到部署全流程解析
  • 图像锐度评分算法实战:从方差、点锐度到梯度法的选择与优化
  • C++跨平台开发中整数类型陷阱与<cstdint>解决方案
  • 劳力士中国官方售后服务中心|全部网点地址及24小时热线权威信息通告(2026年7月更新) - 劳力士服务中心
  • 如何基于用户需求生成高质量技术博文
  • 2026最新衡水本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水