C 碎片五 数组
构造类型数据是有基本类型数据按照一定规则组成的。数组,结构体,共用体都属于构造类型的数据。数组是有序数据的集合,C语言数组中的每一个元素都属于同一个数据类型,用数组名和下标来唯一确定数组中的元素。
一、一维数组
使用场景:当我们需要存储大量同类型数据的时候可以用数组
一维数组定义:具有相同数据类型变量的有序集合 (空间有序)
声明数组的格式: 类型 数组名[常量表达式]
例: int scores[5] ;
表示:定义了一个整型一维数组,数组名为scores,scores数组有5个元素
说明:
1. 数组名的命名规则? 遵循标识符命名规则
2. 数组名是? socres
3. 数组的元素类型是? int , 去除数组中的scores[]剩下的就是数组元素的类型
4. 数组的类型是? int [] , 去除数组名剩下的就是数组的类型
5. 数组的元素个数? 5
6. 数组的元素分别是? scores[0]、scores[1]、scores[2]、scores[3]、scores[4]
7. 数组的访问格式?数组名[索引/下标] 索引范围 <0 -- (元素个数-1)> 从零开始代表第一个元素 依次类推
一维数组初始化:
1. 上面数组没有初始值,默认是随机值。
2. 使用数组的时候一般要进行初始化,如果不知道数组中要放什么,那么一般做清零处理。int scores[5] = {} ;
3. 数组也可以部分初始化。int scores[5] = {1,2,3} ; 那么数组中的前三个元素是1,2,3 后两个元素默认为0
4. 一般定义的时候要给出元素个数,也可以 int scores[] = {1,2,3,4,5} ; 数据的个数确定就不用指定元素个数
数组越界:数组访问一定不要越界,越界后后果是不可预测的,是危险的,不安全的
其他数组:上面演示的是整型数组,也可以是 char c[5] = {"h","e","l","l","o"} ; double , float 等
二、二维数组
二维数组定义的格式: 类型 数组名[常量表达式][常量表达式]
二维数组的本质:二维数组可以看成是特殊的以为数组,它的元素又是一个一维数组
例: int scores[2][3] ;
表示:定义了一个整型二维数组,数组名为scores,scores数组有2个元素
说明:
1. 数组的元素个数? 2 , 紧挨着数组名后的[]中的数字就是数组元素个数
2. 数组的元素类型是? int [], 去除数组中的scores[]剩下的就是数组元素的类型
3. 数组的类型是? int [][] , 去除数组名剩下的就是数组的类型
4. 数组的元素分别是? scores[0][0]、scores[0][1]、scores[0][2]、scores[1][0]、scores[1][1]、scores[1][2]
5. 数组的访问格式?数组名[索引/下标][索引/下标]
6. 一维数组的所有性质,二维数组都满足
二维数组初始化:
1. 上面数组没有初始值,默认是随机值。
2. 使用数组的时候一般要进行初始化,如果不知道数组中要放什么,那么一般做清零处理。int scores[2][3] = {{0,0,0},{0,0,0}} ;
3. 数组正常初始化。int scores[2][3] = {{1,2,3},{4,5,6}} ;
4. 二维数组的元素个数初始化的时候可以省去 但是第二个[]中不能省去
三、字符和数组
区分四个零0,‘0’,‘\0’,“0” (字符‘\0’也即为空和数字0的ASCII码值是一样的)“0”包含一个字符0和‘\0’
各种数组初始化为空的方法:
对比下面的结果得出:初始化为空(0)时,就是在内存中让这段地址的ASCII码值为0
所以{},0,/0,其实效果是一样的,为了不引起歧义,int型对应{}或0,char型
对应{}或/0,另外的也可以,但不推荐。
//++++++++++++++++++++++++++++++++++++++++//
1.整型数组(float,double): int a[10]={}; int a[10]={0}; int a[10]={‘\0’}
2.字符型数组:一维: char a[10]={}; char a[10]={0}; char a[10]={‘\0’};
二维: char a[10][10]={}; char a[10][10]={0}; chara[10][10]={‘’0’};
下面需要重点说明,指针数组里面存放的是地址(长整形8个字节),所以初始化为空的时候打印的都是0
3.指针数组:int型 int * p[10]={}; int * p[10]={0}; int * p[10]={‘\0’};
char型 char * p[10]={}; char * p[10]={0}; char * p[10]={‘\0’};
四、循环和数组
数组元素的遍历:一般要用循环对数组进行遍历
//for循环
int a[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++) {
printf("%d\n",a[i]);
} //while循环
int a[5] = {1,2,3,4,5};
int i = 0;
while (i<5) {
printf("%d\n",a[i]);
i++;
}
五、数组排序
1. 选择排序法
int a[5] = {5,4,3,2,1};
//按照 从小到大排序
选择法:从第一个元素开始 依次拿数组中的每个元素a[i],跟它后面的每个元素进行比较 a[i] 和 a[j],把大的放后面(if a[i] > a[j] —>a[i]和a[j]交换)
5 4 3 2 1
第一轮:始终拿a[0]跟后面的a[1]a[2]。。a[j]进行比较 ,把大的放后面(if a[0] > a[j]—>交换)
1 5 4 3 2
第二轮:始终拿a[1]跟后面的a[2]a[3]。。a[j]进行比较 ,把大的放后面(if a[1] > a[j]—>交换)
1 2 5 4 3
第三轮:始终拿a[2]跟后面的a[3]。。a[j]进行比较 ,把大的放后面(if a[2] > a[j]—>交换)
1 2 3 5 4
第四轮:始终拿a[3]跟后面的a[4]。。a[j]进行比较 ,把大的放后面(if a[3] > a[j]—>交换)
1 2 3 4 5
int a[5] = {5,4,3,2,1};
//外循环 控制轮次
for (int i = 0; i < 5-1; i++) {
//拿a[i]跟后面的每个元素进行比较
//i = 0
//a[0] 跟 a[1]a[2]a[3]a[4]比较
for (int j = i+1; j < 5; j++) {
if (a[i] > a[j]) {//升序 //如果 a[i] > a[j] 降序
//交换位置
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
//打印
for (int i = 0; i < 5; i++) {
printf("%d ",a[i]);
}
printf("\n");
2. 冒泡排序法
int a[5] = {5,4,3,2,1};
//升序
//按照 从小到大排序
冒泡法:每一轮都从a[0]开始 依次拿数组中的相邻的两个元素进行比较( a[j] 和 a[j+1]),把大的放后面(if a[j] > a[j+1] —>a[j]和a[j+1]交换)
5 4 3 2 1
第一轮:从a[0]开始比较,相邻的两个元素进行比较(a[0]和a[1],a[1]和a[2],a[2]和a[3],a[3]和a[4],) ,把大的放后面(if a[j] > a[j+1]—>交换)
4 3 2 1 5 —》第一轮得到一个最大的
第二轮:从a[0]开始比较,相邻的两个元素进行比较(a[0]和a[1],a[1]和a[2],a[2]和a[3]) ,把大的放后面(if a[j] > a[j+1]—>交换)
3 2 1 4 5
第三轮:从a[0]开始比较,相邻的两个元素进行比较(a[0]和a[1],a[1]和a[2]) ,把大的放后面(if a[j] > a[j+1]—>交换)
2 1 3 4 5
第四轮:从a[0]开始比较,相邻的两个元素进行比较(a[0]和a[1]) ,把大的放后面(if a[j] > a[j+1]—>交换)
1 2 3 4 5
int a[5] = {5,4,3,2,1};
//外循环 控制轮次
for (int i = 0; i < 5-1; i++) {
//内循环控制比较过程
//比较次数
//i = 0 4 j = 0 1 2 3
//i = 1 3 j = 0 1 2
//i = 2 2 j = 0 1
//i + 比较次数 = 5-1 -> 比较次数(循环次数) = 5-1-i
for (int j = 0; j < 5-1-i; j++) {
if (a[j] > a[j+1]) {//升序 //如果 a[j] < a[j+1] 降序
//交换位置
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
//打印
for (int i = 0; i < 5; i++) {
printf("%d ",a[i]);
}
printf("\n");
C 碎片五 数组的更多相关文章
- p/invoke碎片--对数组的封送处理
因为数组是引用类型,所以数组的处理根据数组元素的类型是否为“可直接传递到非托管代码”的类型而分为两种情况.主要目标是看内存是怎么变化的,是复制还是锁定. 数组中的元素是"可直接传递到非托管代 ...
- ES6(五) 数组扩展
Array.of方法用于将一组值,转换为数组. Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES ...
- java 基础知识五 数组
java 基础知识五 数组 数组保存的是一组有顺序的.具有相同类型的数据. 同一个数组中所有数据元素的数据类型都是相同的. 可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按顺序存放 ...
- Javascript入门(五)数组操作、循环语句
一.数组与数组操作 <script type="text/javascript"> //数组定义方式 var list1 = new Array(1,2,3); var ...
- es6基础系列五--数组的拓展
Array.from() 用于将两类对象转为真正的数组,类似数组对象和可遍历对象(包括数据结构Set和Map)转化为数组 格式:Array.from(arrayLike[, mapFn[, thisA ...
- C语言基础五 数组的应用
.根据用户输入的10人成绩并将其保存到数组中,求最高成绩,最低成绩和平均成绩 int scoure[10];//存储10个数据的数组 int i; int sum;//总成绩 int max,min, ...
- C语言基础五 数组
数组跟变量的区别? 数组是可以在内存中连续存储多个元素的结构,所有元素必须属于相同类型. 格式:元素类型 数组名[元素个数]: 数组的特点: 只能存放单一元素的数据,里面存放的数据成为元素. 数组的声 ...
- C语言基础知识(五)——数组与指针的等价表示
void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...
- 面试题五 数组中出现次数超过一半的数字 时间为O(n)
也就是说 该数字出现的次数比其他所有数字出现次数的和还要多. 因此可以保存两个值,一个数字,一个次数. 遍历时 1.如果数字相同,count++ 2.如果count == 0 count = 1 nu ...
随机推荐
- C语言学习笔记--void关键字
1.C语言中Void关键字的含义 void 修饰函数返回值和参数——为了表示“无”,如果函数没有返回值,那么应该将其声明为 void,同样的,如果函数没有参数,也应该声明其参数为 void //f() ...
- Qt乱码解决办法(常量中有换行符)
用记事本打开源代码,然后点另存为,utf-8,编码覆盖 QStringLiteral("打开相机")
- SQL查询语句大全集锦
SQL查询语句大全集锦 一. 简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的 表或视图.以及搜索条件等. 例如,下面的语句查询t ...
- [原创]SQL表值函数:获取从当月计算起往前自定义月份数
今天我现在发现看一篇博文不能够太长,只要能够描述清楚自己想表达的东西,能够让大家知道你要讲什么就行了.因为我今天看了一些长篇博文,真的觉得知识点太多了, 会让人囫囵吞枣. 这篇博文跟我昨天发表的类 ...
- 面试问题 - SQL 中存储过程与函数的区别
SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行. 但函数也有着更多的限制,比如不能使用临 ...
- 微信小程序自学第一课:工程目录结构与.json文件配置
注册成为开发者 地址: https://mp.weixin.qq.com/cgi-bin/wx 开发者工具下载地址 https://mp.weixin.qq.com/debug/wxadoc/dev/ ...
- return 、break和continue的区别和作用
1.return关键字并不是专门用于跳出循环的,return的功能是结束一个方法. 一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束.与continue和b ...
- asp.net 防止二次提交 以及UseSubmitBehavior属性-转
页面上有一个按钮,点击之后提交表单,如果什么都不管的话,用户可以在服务器响应完成之前再次点击,这样就出现了二次提交,后果可大可小. 那么我们应该防止二次点击,就要在用户点第一次之后马上Disable这 ...
- [CentOS7] systemd
声明:本文主要总结自:鸟哥的Linux私房菜-第十七章.認識系統服務 (daemons),如有侵权,请通知博主 查看当前系统设定的服务启动脚本的类型:ls /usr/lib/systemd/syste ...
- SCUT - 321 - Tobby's magic - 线段树
https://scut.online/p/321 第一次做区间线段树. 感觉和单点的一样啊.pushdown的时候要注意一些问题,st的值有可能是跟区间长度有关的. #include<bits ...