我们需要表示某个班级学生的年龄,比如,张三今年3岁,李四今年80岁,很显然,我们可以用C语言中的某个数据类型来表示,比如int型:int age_zhangsan = 3; int age_lisi = 80; 那如果这个班级有50个同学,我们是不是需要定义50个变量来存放每个同学的年龄呢,当然可以,但是这么做真的很不合理。类似这样的问题,用数组就很好解决,同样的问题我们可以用 int ages[50]; 来表示,简单明了。
继上一篇《快速上手系列-C语言之基础篇(二)》写数据类型和运算符相关内容之后,这里简单介绍一下C语言中非常常用的一种数据结构,即数组。
数组的基本概念:
1、在程序设计中,为了方便处理数据,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的相同类型数据元素的集合称为数组。数组往往被认为是一系列相同类型的变量,就像你去撸串儿,有羊肉串,有猪肉大串,也有串土豆片的等等,但很少有一串上既给你串了土豆又串了羊肉的,因为它们不是一个类型的,价格不一样串在一起不好算钱不是。
2、在C语言中,数组属于构造数据类型
一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或构造类型.按数组元素类型的不同,数组可分为数值数组、字符数组、指针数组、结构体数组等类别int a[10] = {1, 2, 3, 4, 5, 6}; //一维数组,整型数组a,有10个元素int b[4][2]={ {1, 2}, {3, 4}, {5, 6}, {7, 8} }; //二维数组,有四个元素,每个元素都是一个一维数组char buf[5] = {‘a’,’b’,’c’}; //字符数组struct student stus[5]; //结构体数组char buf[6] = {“hello”};char *q[10] = {&a[0], &a[1], &a[2]};char (*q)[10] = &a;
一维数组:
1、一维数组:
同一个数组,所有元素的数据类型是相同的.数组名的书写规则应符合标识符的书写规定.数组名不能与其它变量名相同,以下是错误的:void main( ){int num;float num[10];}方括号中常量表达式表示数组元素的个数;如a[3]表示数组a有3个元素,其下标从0开始计算,因此3个元素分别为a[0],a[1],a[2]不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式,例如:#define NUM 5void main( ){int n = 10;int a[n]; //错误int a[3+2],int a[2+NUM];}
2、一维数组的初始化:
在定义数组的同时对其进行赋值,称为初始化可以只给部分元素赋初值当{ }中数值少于元素个数时,只给前面部分元素赋值例如:int a[10]={0, 1, 2, 3, 4}; 只给a[0]~a[4]5个元素赋值,后5个元素自动赋0只能给元素逐个赋值,不能给数组整体赋值例如:给5个元素全部赋1值正确:int a[5]={1,1,1,1,1};错误:int a[5]=1;给全部元素赋值时,可以不给出数组元素的个数例如: int a[5]={1,2,3,4,5};可写为: int a[ ]={1,2,3,4,5};注意:全局数组若不初始化,编译器将其初始化为零,局部数组若不初始化,内容为随机值;
3、一维数组的引用:
数组元素也是一种变量,其标识方法为数组名后跟一个下标,在C语言中只能逐个地使用下标变量,而不能一次引用整个数组:
二维数组
1、二维数组(在逻辑上二维数组是矩阵)
数组若只有一个下标,称为一维数组,其数组元素也称为单下标变量;在实际问题中有很多量是二维的或多维的,例如代数中的矩阵、生产中的报表;因此C语言允许构造多维数组;多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量;多维数组可由二维数组类推而得到
2、二维数组的定义
int a[3][4];定义了一个三行四列的数组,数组名为a,其元素类型为整型;该数组的元素个数为3×4个,即: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]二维数组在概念上是二维的,即其下标在两个方向上变化。实际的硬件存储器却是连续编址的,也就是说存储单元是按线性排列的,即放完一行之后顺次放入第二行。
3、二维数组的初始化
例如:数组a[2][3]按行分段赋值可写为:int a[2][3]={ {80, 75, 92}, {61, 65, 71} };按行连续赋值可写为:int a[2][3]={ 80, 75, 92, 61, 65, 71 };
4、二维数组的引用:
比如我们定义一个2行3列的二维数组 a[2][3]; 分别按列和按行打印出每个元素:
按列打印
按行打印
字符数组:
1、字符数组的定义:
初始化赋值的时候可以不给定数组的大小,如char buf[6]="hello"; 可以写成char buf[]="hello";
char buf1[] = {'h', 'e', 'l', 'l', 'o'}; //没有'\0'char buf2[] = “hello"; //有'\0'
注:这里需要注意一下,使用printf打印buf1和buf2,打印出现这种结果是因为printf遇到‘\0’结束。buf2含有'\0',使用printf打印遇到结束符'\0'就会结束,打印结果正常。而buf1没有'\0',输出hello后会继续输出内存中的数据,直到遇到结束符'\0'为止。
char a[][6] = { //一定要给出列数{‘h’,’e’,’l’,’l’,’o’},{‘a’,’b’,’c’,’d’,’e’}};char a[][6] = { “hello” , “world” }
2、字符数组的引用:
用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志‘\0’;注:'\0'是由C编译系统自动加上的
如char buf[] = "hello"; 数组buf在内存中的实际存放情况为:'h', 'e', 'l', 'l', 'o', '\0';
这篇内容暂且就写这么多吧,下篇简单写写C语言函数方面相关内容,想了解的伙伴们可以随时关注。
举报/反馈