一维数组的使用
数组是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×520)其他示例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语言的重要基础它为后续学习指针、结构体等高级特性打下坚实基础。建议多动手编写代码通过实践加深理解。