本节主要介绍数组。

一、数组

/*
数组:一个变量可以存n个变量。
语法:类型   数组名[长度(正整数)];
例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据。char score[5];//定义了一个char 类型的数组,长度为5,可以保存5个数据。
访问数组中的元素:取值:数组名[编号];赋值: 数组名[编号] = 值;元素:数组中实际存放的一个个数据。
下标/索引:系统自动分配的编号,从0开始。
长度:数组实际保存元素的个数。
*/
//例如:
int main(int argc,const char * argv[]){int scores[10];//可以保存10个数据。//循环为scores赋值。for(int i= 0;i<10;i++){scores[i] = i;}//循环打印scores的元素。for(int i= 0;i<10;i++){printf("第%d个元素的值为:%d \n",i+1,i);}
}
/*
数组的赋值:1、先声明,后赋值。类型 数组名[长度];数组名[下标] = 值;2、在声明的时候初始化。1)、类型 数组名[长度] = {数据1,数据2,数据3,数据4,.......};例如:char  charTest[3] = {'a','b','c'};2)、类型 数组名[] = {数据1,数据2,数据3,数据4,.......};例如:char  charTest[] = {'a','b','c'};//第二种方式的长度,编译器会根据元素的个数来确定。3)、类型 数组名[5] = {数据1,数据2};//给的数据小于指定的长度例如:char  charTest[5] = {'a','b','c'};4)、类型 数组名[5] = {[下标]=数据1,[下标]=数据2,};//给的数据小于指定的长度例如:char  charTest[5] = {[3] = 'a',[1] = 'b',[0] = 'c'};遍历数组:用循环依次访问数组中的每一个元素。数组的越界:定义:访问不属于数组本身空间的元素,运行时会报错,也可能是未知的异常。
数组最大访问的下标:长度-1。计算数组的长度:sizeof(数组名);:得到这个数组占用内存的总长度。数组的长度 = sizeof(数组名) / sizeof(类型);
注意:1、数组和数组变量之间,不能赋值。例如:int nums1[5] = {1,2,3,4,5};int nums2[5] = nums1;2、数组名声明后也不能直接赋值。例如:int nums1[5] ;nums1 = {1,2,3,4,5};
原因:数组名是一个地址常量。
*/
/*
数组作为函数的参数:语法:返回值类型  函数名(类型  数组名[]){  函数体;  }
注意:参数中数组的长度可不写,写了也没用,规范的写法时不写。下面看一组代码
*/
void test1(int nums[]){nums[0]=11;nums[1]=22;nums[2]=33;
}
int main(int argc,const char * argv[]){int nums[] = {1,2,3};test();for(int i = 0;i<3;i++){//注意:这里输出的不是1,2,3,而是11,22,33。printf("%d \n",nums[i]);}return 0;
}
/*
上面的代码涉及到另外一个概念:引用传递。概念:传递的是地址,相当于把该变量的内存地址共享给函数。特点:在函数内部改变了形参的值,外面的实参也会发生变化。
说明:基本数据类型(int,char,long,double,float,short)不是引用传递;数组是引用传递。
注意:1、在函数中,不能直接计算形参(数组)的长度,永远等于2。解决办法就是在多传递一个参数,作为数组的长度。2、函数的数组形参可以不写长度,但是区分类型。
*/    

二、冒泡排序

/*
冒泡排序是一种排序算法。
冒泡排序算法的运作如下:(从后往前)1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码如下:
*/
int main(int argc,const char * argv[]){//首先定义个数组int nums[5] = {23,4,7,2,77};int len = sizeof(nums)/sizeof(int);//得到数组的长度for(int i = 0;i < len - 1;i++ ){    //得到循环的次数for(int j = 0 j<len-i-1;j++){   //得到每次需要比较的次数if(nums[j]>nums[j+1]){int num = nums[j];//保存j元素的值nums[j] = nums[j+1];//交换元素的位置nums[j+1] = num ;//把j往后移
                   }}}return 0;
}

三、二维数组

/*
二维数组:一个数组里面的元素又是一个数组。
语法: 类型 数组名[常量表达式1][常量表达式2];
例如:int nums[3][5];
说明:常量表达式1可以理解为行数,常量表达式2可以理解为列数。上述代码可以理解为一个3行5列的数组,数组名为nums,其下标变量的类型为整型。该数组的下标变量共有3×5个,相当于一个拥有3行5列的平面。
所以:类型 数组名[行数][列数];二维数组的初始化:1、先声明,后赋值。
例如:int nums[3][5];nums[0][0] = 1;nums[0][1] = 2;nums[0][2] = 3;nums[0][3] = 4;nums[0][4] = 5;//以此类推
取值:nums[0][4] = 52、声明的时候初始化。
1)、例如:int nums[3][5] = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
语法:类型 数组名[行][列] = {{元素列表},{元素列表},{元素列表}};
取值:nums[0][4] = 5
2)、例如:int nums[3][5] = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};//这样会根据列数自动分行,等价于前一种方式。
语法:类型 数组名[行][列] = {元素列表};
取值:nums[0][4] = 5
3)、例如:int nums[][3] = {1,2,3,4,5,6}//省略行数,会根据列数自动检测分为几行
语法:类型 数组名称[][列数] = {元素列表};
取值:nums[0][2] = 3注意:行可以省略,但是列绝对不可以省略。
*/
//例如:
int nums[][3]={1,2,3,4};//这也是2行3列,按列数分行,不足的以0补齐。

上面介绍了二维数组初始化的一些知识点,下面介绍二维数组的遍历、行和列的计算。

/*
二维数组相当于一个平面,所以需要用两个循环来控制。外层循环控制行数,内层循环控制行数。
例如:
int nums[2][3] = {1,2,3,4,5,6};
for(int i=0;i<2;i++){for(int j=0;j<3;j++){printf("%d \n",nums[i][j]);}
}
输出:1 2 3 4 5 6
二维数组计算列数:
每行的总长度  /  元素占用的字节数
sizeof(数组名[0])/sizeof(类型);
例如:int nums[3][4];sizeof(nums[0])/sizeof(int);//得到4
计算行数:
二维数组的总产度  /  每行的长度
sizeof(二维数组名)  /  sizeof(二维数组名[0])
例如:int nums[3][4];sizeof(nums)/sizeof(nums[0]);//得到3
*/

转载于:https://www.cnblogs.com/bobo-pcb/p/4915103.html

c语言学习之基础知识点介绍(十):数组相关推荐

  1. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法:struct 结构体名{成员列表;};切记切记有分号!说明:成员列表就是指你要保存哪些类型的数据.注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类型.因为类型 ...

  2. 结构体怎么赋值_c语言学习之基础知识点介绍:结构体的介绍

    一.结构体的介绍 /* 语法:struct 结构体名{成员列表;};切记切记有分号!说明:成员列表就是指你要保存哪些类型的数据.注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类型.因为类型 ...

  3. oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍

    一.类方法的使用 /*像我们之前学的方法,必须先实例化这个类的对象才能调用这个方法,类方法不用实例化对象,直接调用这个方法.之前学的方法调用的语法:[对象名 方法名]; //对象方法类方法:[类名 方 ...

  4. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  5. 前端学习——JS基础知识点复习

    一. JS复习 1.1 如何使用JS HTML标签内使用JS,要求写在onclick等事件属性或者href属性中(不推荐使用) 页面中的script标签内可以直接写JS代码 script标签的src属 ...

  6. linux route 刷新_linux基础命令介绍十五:推陈出新

    本文介绍ip.ss.journalctl和firewall-cmd,它们旨在代替linux中原有的一些命令或服务. 1.ip ip [OPTIONS] OBJECT COMMAND ip是iprout ...

  7. 易语言学习笔记——基础篇

    易语言学习笔记20180710 一. 易语言的数据类型可以分为基本数据类型和特殊数据类型 1.     其中基本数据类型分为: ①   数值型 ②   逻辑型 ③   日期时间型 ④   文本型 ⑤  ...

  8. go get 拉取指定版本_go语言学习笔记-基础知识-3

    相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...

  9. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

最新文章

  1. Blender三维建筑场景动画制作学习教程
  2. R系统抽样(systematic sampling)
  3. 用JAVA操作ClearCase
  4. 全网最深刻的理解音频转码swr_convert(2019/10/29已补充修正)
  5. Leetcode 之Count and Say(35)
  6. AB1601某些io口不支持较高频率信号的输入
  7. 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来
  8. mysql心得体会一百字_MYSQL CPU 100%实例详解
  9. 职业教育计算机课教学反思,职高课后的教学反思(精选5篇)
  10. 华为综合测评是什么_喝水不用等待,温度随心控随时喝到热水,测评华为智选恒温电水壶...
  11. php:两个文件夹递归地比较,没有的文件自动复制过去
  12. 详细解析堆排序java实现
  13. QT 5.9.0下载安装及配置教程(自动化运维环境)
  14. 安装 Maxwell
  15. java组件技术考试题_Java核心技术2020年春答案试题题目及答案,期末考试题库,章节测验答案...
  16. 绝知此事要躬行|fatal: not in a git directoryError: Command failed with exit 128: git
  17. maven plugins 飘红问题
  18. 一次招聘“乌龙”事件
  19. vue -V 执行失败 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。
  20. 电脑系统重装后音频驱动程序怎么修复

热门文章

  1. options请求_前端数据请求的终极方案
  2. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...
  3. docker export_docker构建python3.7镜像
  4. mysql mybatis cdata_mybatis中<![CDATA[]]>的用法
  5. fga 例子 oracle,利用Oracle FGA实现审计
  6. pythonxml解析拿到控件坐标_Python解析xml中dom元素的方法
  7. 如何做可靠的分布式锁,Redlock真的可行么
  8. 在Apache配置反向代理即实现输出内容替换
  9. JavaWeb基础学习笔记
  10. 机器学习入门01-K临近(KNN)的java实现