1. 数组
1.1概念
一组数据类型相同的元素组合在一起
特点:1.数据类型相同;2.地址连续
2.2定义
存储类型 数据类型 数组名[元素的个数];
Int arr[5];
数据类型:数组中元素的数据类型
数组的数据类型:int [5];
数据类型:去掉变量名,剩下的就是数据类型;
数组所占的内存空间的大小 = sizeof(数据类型)* 元素的个数
数组名:1、整个数组
2、 数组首元素的地址 arr == &arr[0] (获取一个变量的地址:&+变量名)
注意:定义数组时,元素的个数必须为一个确定的值(常量/常量表达式)
2.3初始化
总结:
1、 数组定义在函数体内,如果没有进行初始化,里面的所有元素是随机值(局部变量)
2、 数组定义在函数体外,如果没有进行初始化,里面的所有元素为0(全局变量)
3、 数组定义在函数体内,并且用static进行修饰,里面的所有元素为0(静态局部变量)
2.4访问
数组名[下标]; 注意:下标从0开始;
总结
1、 int a[5];
a[5] = {1,2,3,4,5}; //error:a[下标]: 没有a[5] ; 就算有,只是一个int类型的元素
2. Int a[5];
a = {1,2,3,4,5}; //error:数组名==数组首元素的地址== &a[0];
3. Int a[ ] = {0}; //对,但意义不大:int a = 0;
4. Int a[ ]; //error:计算机并不清楚此时要分配多大的内存空间
2. 冒泡排序
思想:从左往右,两两依次比较,如果前一个数比后一个数大,就交换位置,反之,不变
N个数需要比较N-1趟,趟数+1,次数-1
3. 字符数组
字符数组:保存一组char类型的数据
存储类型 数据类型 数组名[元素的个数];
数据类型:数组中元素的数据类型
定义: char str[10];//定义了一个字符数组str,该数组中可以存放10个char类型的字符
数组所占的内存空间== sizeof(char)*10 = 10
数组的数据类型:char [10];//去掉数组名
字符串:用字符数组来保存,字符数组的本质就是字符串;
给字符数组清零:
Char str[10] = {0}
Char str[10] = {‘\0’};
给字符数组进行赋值:
1、Char str[10] = { ‘h’,’e’,’l’,’l’,’o’ };
Str[5]----->str[9] ==’\0’;
“hello” = ‘h’,’e’,’l’,’l’,’o’,‘\0’
1、 Char str[10] = “hello”;
//数组名就是数组首元素的地址
//&str[0] == str
4. 字符串的输入输出函数
4.1字符串的输出函数
%s:字符串
Printf(“ %s ”, str);
puts(数组名);
功能:将数组中的内容打印到终端,并且自动换行
注意:打印到‘\0结束
4.2字符串的输入函数
Scanf(“%s”,str);
gets(数组名);
功能:将输入的字符串保存在数组中,并且在末尾自动添加‘\0’
注意:gets不会进行越界检查,如果超出范围,就会操作未申请到的内存空间,段错误
出现段错误的原因:非法操作你没有申请的空间
4.3scanf和gets的区别
Scanf写在gets之上时,会出现异常情况(gets吃掉了‘\n’)
1、 gets以回车作为结束符,但是scanf以空格,回车TAB作为变量输入结束的标志
2、
缓冲区:
Gets在输入结束后,会自动清空缓冲区的内容
Scanf在输入结束后,会在缓冲区中遗留空格、回车、tab
输入:
Gets:进行输入时,回先去检查缓冲区的内容,如果缓冲区有内容,会率先输出缓冲区当中的内容
Scanf:键入,不会检查缓冲区的内容
4.4printf和puts的区别
puts会自动换行,而printf不会
5. 字符串的处理函数
5.1求字符串长度
strlen(数组名);
返回值:求得的字符串的实际长度,不包含’\0’
strlen和sizeof的区别:
1、 strlen求到的是字符串的实际长度,而sizeof求到的是申请到的内存空间的大小
2、 Strlen是一个函数,sizeof是一个运算符
案例:不使用strlen函数,求字符串的实际长度
5.2字符串的拷贝函数
Strcpy(数组1,数组2/字符串);
作用:将数组2中的内容拷贝给数组1,包含‘\0’,相当于完全拷贝
注意:数组1的容量要大于数组2
Strncpy(数组1,,数组2/字符串,n);
作用:将数组2或者字符串中的前n个字符拷贝给数组1
5.3字符串的连接函数
Strcat(数组1,数组2/字符串);
功能:将数组2中的内容连接到数组1中去,数组1中的’\0’会被覆盖
注意:数组1的容量要足够大(字符串1+字符串2)
Strncat(数组1,数组2/字符串,n)
功能:将字符串2的前n个字符连接到字符串1后
5.4字符串的比较函数
Strcmp(数组1/字符串1,数组2/字符串2);
功能:比较字符串1和字符串2的大小
返回值:
大于0:字符串1 > 字符串2
等于0:字符串1 == 字符串2
小于0:字符串1 < 字符串2
比较规则:从左往右,依次去比较字符串中的每个字符的ascii值,直到遇到不同的ascii码或者遇到‘\0’,结束比较
6. 二维数组
6.1概念
二维数组:(数组数组):一堆数组的元素组合在一起
元素为一维数组的一堆数组:1.数据类型相同,2.地址连续
(一维数组的元素的类型以及个数必须相同)
6.2定义
存储类型 数据类型 数组名[行数][列数];
Int arr[4][3] ; //保存了4个一维数组
行数:一维整型数组的个数
列数:一维整型数组中元素的个数
实际的元素的个数:行数*列数
内存空间的大小:sizeof(数据类型)*行数*列数
数据类型:数组最里面的元素的数据类型
6.3初始化
行数可以省略,列数不可以省略
6.4访问
访问数组中的元素:数组名[下标名]
7. 二维字符数组
二维字符数组:
存储类型 数据类型 数组名[行数][列数];
Char str[3][10];
//相当于定义了一个二维数组str,数组中有3个元素,每个元素又是一个拥有10个char类型的一维数组
行数:字符串的个数(一维字符数组的个数)
列数:字符串最多可以保存几个字符(一维数组中元素的个数)
8. 函数
8.1概念
具有独立功能的模块
8.2调用函数
函数名(参数);
返回值:int(字符串的实际长度)
注意:参数的个数,以及参数的类型;返回值的类型(是否需要接收返回值)
8.3自定义函数
8.3.1自定义函数
存储类型 数据类型 函数名(形式参数列表)
{
函数体;
}
存储类型:auto、static、extern、register
数据类型: 返回值的数据类型(void)(数据类型省略不写,默认是int类型)
函数名: 见名知意
形式参数列表:(由程序员自己去确定!)要实现的功能需要几个参数,以及每个参数是什么类型
函数体:实现具体的功能
返回值:若没有返回值,void;返回值也可以省略,如果省略,默认int类型(返回有且只能有一个)
8.3.2调用函数
函数名(实际参数列表);
注意:
1、 需要将实参的值拷贝给形参,实参的个数以及数据类型要和形参一致
2、 实参,可以是变量,常量,表达式,但是必须是一个确定的值
3、 实参和形参是两块独立的空间
4、 传参,实际上是将实参的值拷贝给形参
5、 形参是局部变量,在函数调用时开辟空间,函数调用结束,立即释放
8.3.3函数声明
如果函数没有写在main函数之前,就需要声明;
声明:将函数头部直接复制粘贴至main函数之前,然后加上分号
声明的作用:帮助编译器做语法检查