拓冰建站拓冰建站
首页 / 资讯中心 / 正文

7.初始化总结与数组

一、普通变量初始化int、char、double、short、long long变量存储单个数据的内存单元。可以比喻成单独的小盒子一个盒子只能存放一份数据。 共 3 种书写形式初始化定义同时赋值int a 10; char ch A; double num 3.14;通俗理解一边造盒子一边直接把数据放进盒子。这是严格意义上的初始化。先定义后赋值不属于初始化int b; // 变量定义开辟内存空间 b 20; // 赋值操作修改变量存储的值通俗理解先做出空盒子后续代码再把数据放进去这个动作叫赋值不是初始化。定义变量后通过标准输入赋值int num; scanf(%d, num); char ch; scanf(%c, ch); double d; scanf(%lf, d);说明语法层面属于赋值。课堂练习中常用来给变量设置初始数据但不属于初始化选择题注意区分。 通俗理解盒子提前做好由键盘输入内容存入盒子。单个字符 char 的三种写法定义时初始化char ch M;先定义后赋值char ch; ch X;标准输入赋值char ch; scanf(%c, ch);二、字符串字符数组的四种初始化方式概念C 语言字符串是以\0字符串结束符结尾的字符序列。 使用字符串处理函数必须引入头文件#include string.h字符串字面量初始化最常用char str[100] student;说明使用双引号包裹字符串编译器自动在末尾追加\0。 通俗理解双引号写文字电脑自动在文字末尾加上结束标记。逐字符列表初始化手动添加结束符char str[8] {a,b,c,d,\0};说明逐个列出字符必须手动写入\0作为字符串结束标记。循环逐个字符读取手动添加\0原理演示代码工程不推荐char str[100]; int i 0; while (1) { scanf(%c, str[i]); if (str[i] \n) break; i; } str[i] \0;通俗理解一个字一个字从键盘读入按下回车停止最后手动补上字符串结束标记。 注意scanf(%c)会读取换行符容易出现读取异常。使用strcpy字符串复制函数完成初始化char str[100]; char temp[] hello world; strcpy(str, temp);说明将源字符串temp的内容复制到目标字符数组str。第二部分数组一、引入数组的原因如果需要存储多份同类型数据不使用数组就要单独定义多个独立变量。 例存储 100 名学生成绩需要定义 100 个不同名称的 int 变量。缺点变量数量多代码冗余批量计算、遍历数据需要重复编写大量代码无法统一批量输入、批量输出。数组定义一组相同数据类型的连续内存单元共用同一个数组名依靠下标索引区分每一个元素。通俗理解一整排连续、同类型的小盒子共用一个名字靠编号区分每个盒子。 优势只需一行代码定义配合循环完成批量输入、遍历、计算精简代码。数组分为两类一维数组、二维数组提示不带\0的普通字符数组仅作了解做题、写代码优先使用带\0的字符串数组否则会出现乱码。二、一维数组1. 一维数组定义语法数据类型 数组名[元素个数];示例int arr[10]; // 存放10个整型元素 double brr[5]; // 存放5个双精度浮点型元素 char str[20]; // 字符数组用于存储字符串两条核心规则[]内一般写常量表达式C99 标准支持变长数组 VLA变量作为长度应试场景不使用。数组下标从 0 开始。int arr[10]有效下标范围0~9访问arr[10]属于数组越界会造成未定义行为乱码、程序崩溃。通俗理解10 个盒子编号 0 到 9不存在编号 10 的盒子强行访问会出错。2. 一维数组的三种初始化方式int、double 通用① 定义数组时初始化列表赋值int arr[3] {1,2,3}; double brr[4] {1.1,2.2,3.3,4.4}; // 省略数组长度编译器自动统计元素个数 int arr[] {10,20,30};补充初始化列表提供元素数量少于数组总长度时剩余元素自动初始化为 0。 示例int arr[5]{1,2};数组元素1,2,0,0,0② 数组定义完成后循环逐个元素赋值int arr[5]; for(int i0;i5;i) { arr[i] i1; }③ 数组定义后循环读取标准输入考试高频写法int arr[5]; for(int i0;i5;i) { scanf(%d, arr[i]); }3. 计算一维数组元素个数常用公式⚠️ 限制仅能在数组定义所在函数内使用。数组作为函数形参时数组名退化为指针该公式失效。int len sizeof(数组名) / sizeof(数组名[0]);解释sizeof(数组名)整个数组占用的总字节数sizeof(数组名[0])数组单个元素占用字节数 两者相除得到数组元素总个数。4. 遍历输出一维数组全部元素int arr[5] {1,2,3,4,5}; int len sizeof(arr)/sizeof(arr[0]); for(int i0;ilen;i) { printf(%d , arr[i]); }5. 一维数组常见考点数组元素求和、求平均值、查找最值最大值 / 最小值、顺序查找、统计元素出现次数后续学习冒泡排序、选择排序、插入排序。三、普通字符数组了解即可不推荐直接使用char arr[5]{a,b,c,d,e};特点没有\0结束符不是 C 语言字符串。 缺陷不能直接使用%s格式输出无法使用strlen、strcpy等字符串库函数使用%s输出会出现乱码。建议代码中统一使用带\0的字符串。四、字符串字符数组输入输出前提字符数组作为字符串使用时数组容量 ≥ 有效字符个数 1预留位置存放\0。scanf(%s,数组名);读取连续非空白字符遇到空格、回车停止数组名本身是地址前面不加取地址符fgets(字符数组,最大读取字符数,stdin);可以读取包含空格的整行字符串printf(%s,字符数组);输出字符串读到\0停止输出五、二维数组概念二维数组可以理解为数组的数组逻辑上呈现表格形态由行、列两个下标定位元素。 通俗理解多行多列的盒子表格。1. 二维数组定义语法数据类型 数组名[行数][列数];示例int arr[2][3];2 行 3 列一共 6 个整型元素。 行下标0、1列下标0、1、2。规则初始化时行数可以省略列数不能省略。2. 二维数组初始化① 定义时初始化int arr[2][3] {{1,2,3},{4,5,6}}; // 平铺简写写法 int arr[2][3] {1,2,3,4,5,6};② 双层循环标准输入逐个赋值int arr[2][3]; int row sizeof(arr)/sizeof(arr[0]); // 获取总行数 for(int i0;irow;i) { int col sizeof(arr[i])/sizeof(arr[i][0]); // 获取当前行的列数 for(int j0;jcol;j) { scanf(%d, arr[i][j]); } }3. 遍历打印二维数组外层循环遍历行内层循环遍历当前行的每一列一行打印结束后换行。int row sizeof(arr)/sizeof(arr[0]); for(int i0;irow;i) { int col sizeof(arr[i])/sizeof(arr[i][0]); for(int j0;jcol;j) { printf(%d , arr[i][j]); } printf(\n); }六、数组高频易错点数组下标从 0 开始访问超出范围的下标属于数组越界产生未定义行为。定义数组时方括号内一般使用常量C99 变长数组应试不采用。不能直接用ba完成数组整体赋值编译报错整数数组使用循环拷贝字符串使用strcpy。局部数组不初始化元素为随机垃圾值全局数组默认全部元素初始化为 0。scanf输入普通变量需要加字符数组名代表首地址不需要加 。字符串比较不能直接使用数组名比较的是内存地址字符串比较必须使用strcmp。strlen只适用于 C 语言字符串统计有效可见字符数量不包含末尾\0。七、字符串库函数头文件#include string.hstrlen(字符串)获取字符串有效字符长度不计入\0strcpy(目标字符数组,源字符串)字符串复制把源字符串拷贝到目标数组strcat(目标字符数组,追加字符串)字符串拼接将后一段字符串追加到目标数组末尾strcmp(字符串1,字符串2)字符串比较返回值 0两个字符串完全相等返回值 0字符串 1 小于字符串 2返回值 0字符串 1 大于字符串 2标准判等写法if(strcmp(s1,s2)0)
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门