1. 输入输出缓冲区
1.1 输入缓冲区
键盘——>键盘缓冲区——>输入缓冲区——>程序scanf("%*[^\n]");
scanf("%*c");(丢弃任意一个字符)——>清空输入缓冲区——>程序
解释:* 丢弃读取到的内容
[^\n] 表示任何非\n的字符
如果读取到的数据类型匹配,那么缓冲区中的数据会被成功读取,缓冲区中被读取完的数据就不存在了
1.2 输出缓冲区
程序——>输出缓冲区——>屏幕输出缓冲区内容到屏幕显示的方法:
(1)\n 刷新缓冲区
(2)fflush 用于刷新缓冲区
fflush(stdin)刷新输入缓冲区,但是这个基本不用
fflush(stdout);刷新输出缓冲区(3)输出缓冲区满了的时候,可以显示在屏幕上,(一般大小4Kb)
(4)程序结束
2.数组
2.1 数组的定义
数据类型 数组名 [数组的长度];例如:int nums[10];表示定义了一个可以保存10个int类型数据的名为nums的数组
使用数组名来标记数组的首地址,从而可以找到数组的内存空间,使用下标去访问数组中具体的元素
下标:0 1 。。。9 访问数组中的第二个元素:nums[1]
注意:
int nums [10];表示的是数组的长度,只有在定义的时候[]表示数组的长度
nums[5]; 5表示的是数组的下标,在使用的时候[]表示数组的下标
2.2 数组的初始化
(1)全部初始化int nums[5] = {1,2,3,4,5};
(2)部分初始化
int nums[5] = {11};剩余的元素默认初始化为0
int nums[5] = {0};一般用于将数组所有元素初始化为0
int nums[5] = {};将数组中所有元素初始化为0,不推荐使用
(3)指定初始化
int nums[5] = {[2] = 33};将数组中的第三个元素初始化为33
注意:
(1)C语言中定义数组的时候,要求指定数组的长度,不支持[]在数组名的前面
(2)如果非得不指定数组的长度,那么需要将数组进行全部初始化
int nums[] = {1,2,3,4,5,6};不推荐使用
2.3一维数组的赋值
int num = 10;//变量的初始化num = 10;//变量的赋值
int nums[5] = {11,22,33,44,55};//数组的初始化
结论:
数组定义的时候可以初始化,但是不可以使用数组名进行赋值,如果非要赋值的话,就通过数组的下标去对每一个元素进行赋值
2.4习惯用法
(1)数组的清零for(i = 0;i < n;i++)
{
nums[i] = 0;
}
(2)输入数据到数组中
for(i = 0;i < n;i++)
{
scanf("%d",&nums[i]);
}
(3)数组元素的求和
for(i = 0;i < n;i++)
{
sums += nums[i];
}
(4)数组中的每一个元素都可以像普通变量一样去使用
2.5 数组的深入浅出
-------------------数组名表示的是数组的首地址,也就是数组中第一个元素的地址,数组名是个常量,不可改变
对于数组来说,nums[i]实际上就是相对于数组名nums的一个偏移量
int nums [5] = {11,22,33,44,55};
nums = &nums[0] = nums + 0 = 数组中第一个元素的地址
&nums 打印地址也是数组的首地址,但是级别不一样,分别使用nums + 1和&num + 1来查看级别的不同
扩展信息:
2.6 数组的sizeof值
数组的sizeof = sizeof(数组中元素)*元素的个数int arr[5] = {11,22,33,44,55};
sizeof(arr) = 4*5 = 20;
特例:
void fn (int arr[5])
{
sizeof(arr) = 4;//这里arr相当于一个指针,sizeof(指针) = 4
}
2.7数组的下标越界访问
C语言中数组是可以越界访问的,程序中变量的内存分配顺序与变量的定义顺序无关,对数组进行越界访问时可能访问到其他变量的值,也可能引发段错误,所以要求程序员自己对数组进行下标控制,尽量避免数组的下标越界
2.8 数组的下标越界赋值
数组的下标越界赋值可能修改其他数据的值,还有可能引发段错误,所以要防止数组下标的越界3 二维数组
3.1二维数组的定义
数据类型 数组名[行数][列数]例如:int arr[3][4];表示定义了一个3行4列的二维数组
注意:
二维数组在内存中是按照行主序进行排列 的
3.2二维数组的初始化
(1)全部初始化int arr[2][3];看做具有两个元素的数组,而每一元素又是一个具有三个元素的一维数组
int arr[2][3] = {{11,22,33},{44,55,66}};
(2)部分初始化
int arr[2][3] = {{11,22},{33}};剩余的元素默认初始化为0
int arr[2][3] = {{0}};表示将二维数组中所有元素初始化为0
(3)指定初始化
int arr[2][3] ={[0][2]=33};将第一行中第三个元素初始化为33
行主序排列:int arr[2][3] = {11,22,33,44}
例子:使用二维数组输出单位矩阵
3.3 习惯用法
(1)清零for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
arr[i][j] = 0;
}
}
(2)从键盘键入
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
scanf("%d",&arr[i][j]);
}
}
(3)求和
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
sum += arr[i][j];
}
}
3.4变长数组(C99支持)
例子:int num = 0;
printf("请输入数组的长度:\n");
scanf("%d",&num);
int arr[num];
注意:
(1)注意变量和数组的定义顺序
(2)变长数组不能进行初始化,很少使用