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之前的字符实际个数

存储单个字符串,选择一维字符数组;存储多个字符串,选择二维字符数组。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐