数组

1、 一维数组的定义和使用

通过对前面知识的学习,我们已经知道如何定义和使用一个一个的各种变量,但总有不够用的时候。举个例子,我要记录一个班32个同学C语言这科的成绩,难道要定义32个变量?嗯~这个当然可以,但是似乎,好像觉得怪怪的~ 可以再联想一番,如果几百个人或者更多呢? 丹尼斯·里奇(C语言的发明者,Unix之父,必须要牢记这位大师)早就为我们准备了数组这种类型: 数组是同类型有序数据的集合,可以为这些数据的集合起一个名字,称为数组名。该集合中的各个数据项称为数组元素, 每个元素可用数组名和下标表示。 C程序设计中,在数组是一个十分有用的数据类型。 下面将对数组进行详细介绍。 一维数组(姑且先叫一维数组)的定义和使用 在C语言中使用数组必须先进行定义,一维数组的定义方式如下: 类型说明符 数组名 [常量表达式]; 其中类型说明符是任意一种基本数据类型或构造数据类型,它定义了全体数组成员的数据类型,可以发现要比我们定义N个元素要方便的多了,如果把一个元素看作一个点,那么一维数组就像一条线。 名是用户定义的数组标识符;方括号中的常量表达式表示数据元素的个数,也称为数组的长度。需要注意的是,数组中的元素下标是从0开始计算的。例如:

int a[100]; //定义一个数组名为a,存储100个int类型的数组,其元素分别是a[0]~a[99]

float b[10]; //数组名为b的,存储10个float类型的数组,其元素分别是b[0]~b[9]

char c[256]; //定义一个数组名为c的字符型数组 长度为256,其元素分别是c[0]~c[255]

当在函数中只定义数组时,数组里的值和函数里定义一个变量的值一样,都是未初始化过的,我们也可以定义的时候并初始化赋值,并且,当给部分元素赋初值的时候,未被赋值的元素将自动赋值为0,更细一些,int类型未被赋值的元素为0,浮点型为小数类型,而字符类型则为'\0'。 如:

int a[100]={1,2,3,4,5}; //定义一个整型数组a,前5个元素即赋值为1,2,3,4,5,后95个元素值值全部为0

float b[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,0.0}; //定义float数组b并对全部float类型的元素都分别赋值

char c[256]={'C','l','a','n','g','u','a','g','e'}; //定义一个数组名为c的字符型数组 并对前9个元素进行赋值,其余元素全部为'\0'

2、二维数组的定义和使用

通过对一维数组的学习,我们已经能想到,一维数组是呈线性排布的,如果我们需要比如矩阵这样的结构时,该怎么办?一个最直观的想法就是每一行都用一个一维数组存放,那么有几行,就需要几个一维数组。等等,还记得上节课的点与线的关系吗?那矩阵这种结构就是线与面的关系!丹尼斯·里奇同样为我们提供了二维数组(多维数组)这样的东西,很好的解决了这个问题。 二维数组的定义: 类型说明符 数组名[行数][列数]; 如:

int a[3][4];/*定义一个整形二维数组a,有3行4列共12个元素分别为:

a[0][0] a[0][1] a[0][2] a[0][3]

a[1][0] a[1][1] a[1][2] a[1][3]

a[2][0] a[2][1] a[2][2] a[2][3]

*/

char arry[10][10];//定义一个字符型二维数组arry,有10行10列,依次为arry[0][0]~arry[9][9]供100个元素

二维数组的初始化: 二维数组可以用以下两种方式初始化赋值:

int a[3][4]={{1,2,3,4},{10,20,30,40},{100,200,300,400}};//定义一个三行四列的二维数组,按行赋值

int a[3][4]={1,2,3,4,10,20,30,40,100,200,300,400};//定义一个三行四列的二维数组并对其中的12(3*4)个元素进行赋值

您可能会想,为什么第二种也可以?这样的话,定义int a[3][4]和定义int a[12]有什么区别呢?真相是:二维数组与一维数组一样在内存中的存储也是按照线性排布的。 同样,建议您亲自上机实验。

3、字符数组和字符串

用来存放字符的数组称为字符数组。字符数组的各个元素依次存放字符串的各字符,字符数组的数组 名代表该数组的首地址,这为处理字符串中个别字符和引用整个字符串提供了极大的方便。 字符数组的定义形式与前面介绍的数值数组相同。例如:

char c[10];

字符数组也允许在定义时进行初始化赋值。例如:

char c[6]={'c', ' h ', 'i', 'n', 'a' , '\0' };

对字符数组的各个元素逐个赋值后,各元素的值为:

c[0]= 'c',c[1]= 'h',c[2]= 'i',c[3]= 'n',c[4]= 'a',c[5]= '\0';

其中,‘\0’为字符串结束符。如果不对 c[5]赋任何值,‘\0’会由系统自动添加。 字符数组也可采用字符串常量的赋值方式,例如:

char a[]={"china"};


原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2015-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏五分钟学算法

五分钟看懂一个高难度的排序:堆排序

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

1102
来自专栏ACM算法日常

HDU1106:排序 (重新修正)

之前发过一篇HDU 1106的题目,但是因为有童鞋说那篇的源码提交后超时,我们的AlphaWA童鞋重新做了一遍,这次是0ms!算是修正之前的问题,非常感谢~

831
来自专栏SeanCheney的专栏

《Pandas Cookbook》第03章 数据分析入门1. 规划数据分析路线2. 改变数据类型,降低内存消耗3. 从最大中选择最小4. 通过排序选取每组的最大值5. 用sort_values复现nl

1552
来自专栏我是攻城师

理解桶排序算法原理

计数排序,基数排序,桶排序是所有排序算法里面时间复杂度能达到O(N)级别的算法,这主要原因是因为他们不采用基于比较的算法,前面的文章已经介绍了计数排序的原理,本...

6304
来自专栏五分钟学算法

五分钟弄懂有点难度的排序:堆排序

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

1434
来自专栏Vamei实验室

Python补充05 字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时...

2339
来自专栏猿人谷

C++ STL算法系列3---求和:accumulate

 该算法在numeric头文件中定义。 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec start...

2178
来自专栏积累沉淀

JavaScript面向对象与原型

javaScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性...

24310
来自专栏深度学习之tensorflow实战篇

python高阶函数:map(f,[list]),reduce(f,[list],可选初始值),

map,reduce和filter三个函数在python3和python2中发生了较大的差异。具体请看文章后面部分。 1. python的map()函数 ...

3354
来自专栏书山有路勤为径

包含min函数的栈

LeetCode 155. Min Stack 设计一个栈,支持如下操作,这些操作的算法复杂度需要是常数级,O(1) 1.push(x) : 将元素x压入...

1031

扫码关注云+社区

领取腾讯云代金券