输入 /输出 缓冲区 与 数组的常识
2013-12-15 18:03
316 查看
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]);
}
a442
}
(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)变长数组不能进行初始化,很少使用
相关文章推荐
- 缓冲区和数组的输入输出问题
- vector数组中删除相同元素(输入的元素输出时只能出现一次)
- 算法题 -- 输入一个Long数组,按要求输出一个等长的Long数组
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数
- 数组的输入 和输出
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个
- 筛选int类型数组重复值取指定位置的数案例输入好多帽子的价格 ,想买第三便宜的帽子,输出该帽子的价格
- 1.输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值;
- [经典面试题]输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
- 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中最大值
- 输入一列数组,输出它的逆序数组
- 有15个数存放在一个数组中,输入一个数,要求用折半法找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 字符串数组在输入的时候应该给\0预留一个位置,否则将在c++中无法输出,并且编译的时候回报错!!!
- 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素
- 定义二维数组,为数组赋初值、输入值、更改值、按各种方法输出
- 将大于形参m且紧靠m的k个素数存入xx所指的数组中。 例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。C语言编程题【21题】
- c#经典编程实例(一基本的输入输出和循环数组的使用)
- 题目:输入N个整数,找出其中最小的k个整数。例如输入 4,5,1,6,2,7,3,8,输入k=4,则输出最小的四个数是1,2,3,4 算法分析: 算法1.O(n)的算法,修改输入的数组 可以基于get