C语言基础
- 一维数组
- 数组初始化
- 全部初始化
- 部分初始化
- 数组的默认值
- 冒泡排序
- 字符数组
- 二维数组
- 初始化
- 行数是否可省略
- 列数是否可以省略
- 部分初始化
- 访问
- 二维字符数组
- 函数
- 分类
- 库函数
- 自定义函数
- 调用自定义函数
- 函数声明
一维数组
概念:一组数据类型相同的元素的集合
<存储类型> 数据类型 数组名[元素个数];int arr[5]
arr的数据类型是int[5]
存储类型:auto static extern register
特点:
1、元素的数据类型相同
2、地址连续
打印地址的格式化符——%p
数组的数据类型——去掉变量名,剩下的就是数据类型
int arr[4] //开辟16字节空间,数组中的元素是Int类型,给这片空间起名字叫arr
int brr[6]
两个数组的数据类型不同
数组所占大小 = 元素个数*sizeof(元素的数据类型)
数组名的特点:
1、代表数组首元素的地址
2、代表整个数组
数组元素的个数必须是整数,不能是浮点数,数组元素个数必须是一个确定的值,不能是一个变量
数组初始化
全部初始化
int arr[5] = {1, 2, 3, 4, 5};//全部初始化方法一
int brr[] = {1, 2, 3, 4, 5, 6};//全部初始化方法二
在定义数组的时候,给所有元素进行赋值。
只有在全部初始化的时候,才能省略元素个数,此时元素个数由输入决定。
部分初始化
在定义数组的时候,给所有元素进行赋值。
未初始化的部分为0
int arr[6] = {0};//清零
数组的默认值
- 局部变量的数组不初始化,其值为随机值
- static修饰的局部变量的数组不初始化,其值为0
- 全局变量的数组不初始化,其值为0、
访问
冒泡排序
从左到右,依次比较,如果前一个元素比后一个元素大,需要互换位置,反之元素位置不变
字符数组
存储元素类型为字符的集合
每一个元素的数据的类型为char
<存储类型> 数据类型 数组名[元素个数];char str[5];
//分配5个大小为1字节的空间,给这片空间起名为str
- 特点:1 地址连续 2 元素的数据类型相同
- 计算字符数组所占空间大小 = sizeof(char) * 元素个数
- 字符数组以’\0’为结束符
- 字符数组的本质为字符串,打印字符串的格式化符%s
字符串输出输入函数和字符串处理函数
二维数组
- 数组:一组数据类型相同的元素的集合
- 二维数组:一组元素集合在一起(元素:一维数组)——一组一位数组放在一起组成一个大组,就叫二维数组
- 本质:元素为一位数组的数组
- 地址连续,数据类型相同
<存储类型> 数据类型 数组名[行数][列数];
int arr[2][3];
//定义了一个二维数组,该数组有2个元素,每一个元素都是一个有3个int类型元素的一维数组。
//行数:有几个一维数组(二维数组有几个元素)
//列数:一维数组有几个元素
存储类型 auto static register extern
二维数组所占内存空间大小 = sizeof(最里面元素的数据类型) * 行数 * 列数
初始化
int arr[2][3] = {1, 2, 3, 4, 5, 6};
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int brr[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int brr[3][2] = {1, 2, 3, 4, 5, 6};
行数是否可省略
int arr[][3] = {1, 2, 3, 4, 5, 6, 7};
可以,因为确认了一维数组中最里面元素的个数,所以编译器在此时可以计算一维数组的个数,所以可以省略
列数是否可以省略
int arr[2][] = {1, 2, 3, 4, 5};
不可以省略,会产生歧义
总结:二维数组在初始化的时候,行数可以省略,列数不可以省略
部分初始化
int arr[2][3] = {1,2};
int arr[2][3] = {{1}, {4, 5}};
访问
二维字符数组
<存储类型> 数据类型 数组名[行数][列数];
char str[2][3];
//定义了一个二维字符数组,该二维字符数组有2个元素,每一个元素都是一个有3个char类型元素的一维数
组。
//行数:有几个一维数组
//列数:一维数组有几个元素
二维字符数组所占空间大小 = sieof(char) * 行数 * 列数
函数
概念:具有一定功能的模块代码
为什么要有函数?
- 提高代码复用率
- 可以让程序变得模块化
分类
库函数
printf scanf strlen strcpy gets
//使用时候需要添加头文件
#include <stdio.h>
#include <string.h>
自定义函数
<存储类型> 数据类型 函数名(形式参数列表);
//存储类型:auto static register extern
//数据类型:返回值的数据类型(函数本身是一段功能代码,没有数据类型这个概念,其数据类型由函数返回
值体现)
//函数名:见名知意,命名规范和标识符相同
//形式参数列表:实现什么功能,需要什么参数(需要注意参数个数和类型)(列表:表示形参数量可以有多
个)
//函数体:实现功能的代码
//返回值:如果函数没有返回值,就不需要写return,数据类型就是void。返回值有且只有一个。
调用自定义函数
函数名(实际参数)
注意:
- 实参的数据类型和个数必须和形参一一对应(调用的时候是将实际参数的值传给形式参数)
- 实参可以是一个变量、常量、表达式,必须是一个确定的值
- 实际参数和形式参数是两片独立空间
- 传参实际上是将实参的值拷贝给形参
- 形参是局部变量,在函数调用的时候被定义(开辟空间),函数调用结束之后释放空间
函数声明
如果自定义的函数在main函数之后,就需要加上声明
将函数定义的那一行复制到main之前,加上分号,组成函数声明