C语言基础(数组)
goto语法
goto 标签(label)
标签:标明目标代码的位置,是一个不加""的字符串。
循环的嵌套
嵌套规则
3种循环(while,for,do…while)可以相互嵌套,在前一个循环中又嵌套一个循环结构。
break与continue
break语句
功能:
用在switch中,用来跳出switch中的case语句;如果case没有break,可能会产生case穿透。
用在循环中(while,for,do…while),提前结束循环,也就是结束整个循环。
说明:
break不能用于循环语句和switch之外的任何其他语句。
break只能终止并跳出最近一层循环结构(只能跳出单层循环)。
continue语句
功能:
continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。
说明:
仅限于循环语句中。
只能跳出最近一层循环结构(只能跳出单层循环)。
数组
一维数组
定义:数组是相同类型,有序数据的集合。
特征:
每个数据称为元素,所有元素类型相同。
数组中的元素存放在连续的内存空间中。
下标:
数组的下标是从0开始:
数组的最大小标 = 数组的元素个数 - 1
语法:
数据类型 数组名[数组容量];
数组容量还可以叫常量表达式,其值必须是整数。
c89标准:只支持常量和符号常量,不支持变量。
c99标准:引入变长数组(VLA:MSVC(微软编译器)对c99的VLA支持有限,GCC/Clong等编译器支持较好),即可以使用变量,数组在运行的时候决定大小。
类型:代表了数组中元素的类型,数组的空间大小 = 数组中所有元素空间之和
容量:数组中能存储多少个元素,数组容量一定是一个整型
关于数组中元素默认值的问题:
全局作用域(函数外定义)和static修饰的变量:元素的默认值是0
局部作用域(函数内):元素的默认值是随机值,此时强烈建议用户使用前初始
注意:关于默认值,所有类型的值都是0,整型和浮点型表示法0,字符表示法’\0’(对应值0),指针型表示法地址值 0x000000000000→ 0x0
数组的访问
原则:数组中的元素不能一次性访问所有,只能一个一个访问
取值:
[数据类型 变量名 =] 数组名 [下标];
赋值:
数组名 [下标] = 值;
数组的初始化:
说明:所谓初始化,就是定义数组时,用用定义的数据给对应的元素赋值
数据类型 数组名[数组容量] = {,,,};
数组可以部分初始化:也就是可以给数组的前几个元素初始化,未初始化的元素系统将自动初始化,初始值时0
数组根据初始化的元素自动分配大小:
如果定义数组时未定义指定数组容量,则系统会根据初始化的元素个数来决定容量
排序算法:冒泡排序
排序思想(向前冒泡)
对一组数列一次只排好一个元素,针对n个元素,最差情况需要n - 1次可以排好;最好情况需要0次(只需要1轮遍历,无交换操作)
每次排序假定第一个元素是最大或最小的,然后相邻两个元素进行比较,遇到较大或较小的元素进行交换,访问完最后一个元素,就排好了一个数。
在余下元素中,再次应用第二步操作,知道只剩下一个数。
衍生
冒泡排序→鸡尾酒排序、摇坠排序、摇床排序、搅拌排序等
二维数组
定义:
二维数组本质上是数组的数组,即外层数组的每个元素都是一个一维数组,由行和列两部分构成,属于多维数组。可以按照先行后列的方式解读。
二维数组可被视作一个特殊的一维数组,也就是说,当一个数组的每一个元素都是一维数组时,那么这个数组就是二维数组。
数据类型 数组名 [行容量][列容量];
说明:
二维数组在初始化的时候,可以省略行容量,系统会通过初始化后的数据自动推断行容量
二维数组和一维数组一样,可以部分初始化,未初始化部分的元素使用0填充
二维数组在初始化的时候,不能省略列容量,否则编译报错
二维数组创建时必须指定行容量和列容量,初始化时可以只指定列容量。
特殊写法:下标可以是整型表达式 已经有值的变量或者数组的元素 即[] 中最终需要的是一个>= 0且小于数组对应维度容量的整数。
数组元素可以出现在表达式
取值:
[数据类型 变量名 =] 数组名[行下标][列下标];
赋值:
数组名[行下标][列下标] = 值;
行和列的容量计算:
//计算行的大小
int row_len = sizeof(数组名) / sizeof (数组名[行下标0]);
//计算列的大小
int col_len = sizeof(数组名[行下标0]) / sizeof (数组名[行下标0][列下标0]);
矩阵转置:行变列,列变行
字符数组
在C语言中,支持字符串常量、不支持字符串变量。如果想要实现类似的字符串变量,C语言提供了两种方式:
字符数组:
char name [] = "...";
字符指针:
char * name = "...";
概念
元素类型为char的数组叫做字符数组,字符数组往往是用来存储字符串数据的。C语言中字符是字节字符(1字符=1字节)
语法
char 数组名[数组容量];
char 数组名[行容量][列容量];
注意;如果我们的char数组初始化的时候,仅部分初始化,系统自动使用\0填充。这里的\0只是起到一个标识或占位的作用,无法通过printf打印到控制台(无显示无输出)
如果提供的字符个数与数组容量相同,可以省略数组容量,系统会自动确定元素的个数,适合较多字符时。
字符串结束标志
说明:
C语言规定,字符串常量以\0作为结束标志。
编译系统对字符串常量自动添加\0作为结束标志。
程序中往往通过判断\0来检测字符串是否结束。
\0的ASCII码是0,不是一个可输出可显示的字符,是空操作符。
字符串输入
scanf
语法:
scanf(%s, 数组名);
注意:采用scanf进行字符串输入时不能有空格,否则字符串遇到空格就会截断(结束)。
fgets
语法:
fgets(数组名, 数组容量, stdin);
//stdin:C语言内置的宏定义,可以直接使用,表示标准输入模式
功能:
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一般用12位16进制整数表示)
说明:
采用fgets进行字符串输入,可获取所有输入的字符串,包括换行符,若不需要换行符,需手动去除。
stu_names[0][strcspn(stu_name[0],"\n")] = '\0'
gets(数组名);
无输入长度限制,易导致缓冲区内存溢出
字符串输出(追加)
printf
语法:
printf("%s", 数组名);
fputs
语法:
fputs(数组名, stdout);//stdout:标准输出模式
功能:输出一个字符串
功能:字符串可以包含转义字符(以\开头的字符)
关于字符的读写:
从缓冲区读取单个字符:char c = getchar() 等价于 scanf("%c", &c);
向缓冲区写入单个字符:printf("%c", c); 等价于 putchar()
字符串相关函数
字符串拼接:strcat
语法:
strcat(字符数组, 需要拼接的字符串|字符数组|字符指针);
解释:
参数一必须是字符数组,作为数据接收方;参数二可以是字符数组、字符串常量、字符指针,作为数据
这里将参数2的数据拼接到参数1的空间,所以参数一的剩余空间必须足够大,要能容纳参数2数据。
引入:
#include <string.h>
字符串拷贝:strcpy(覆盖)
语法:
strcpy(数组名, 字符串);
解释:
类似于一个字符串赋值给一个字符数组。这个函数一般用来做字符数组的赋值处理。
引入:
#include <string.h>
说明:
strcpy用于将一个字符串(常量|数组|指针)完整复制到目标字符串数组中,实现字符串的"赋值"效果。
字符串比较:strcmp
语法:
strcmp(字符串1, 字符串2);
注意:这里的字符串都可以是常量、数组、指针。
引入:
#include <string.h>
返回值:
字符串1 等于 字符串2,返回0
字符串1 大于 字符串2,返回正数
字符串1 小于 字符串2,返回负数
字符串长度:strlen
语法:
strlen(字符串);
引用:
#include <string.h>
注意:
返回字符串首个\0之前的字符实际个数
存储单个字符串,选择一维字符数组;存储多个字符串,选择二维字符数组。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)