数组
数组的意义与性质
-
数组的定义
定义格式:元素类型 数组名称[常数表达式]
示例:int a[8]; // 定义包含8个整数元素的数组
-
特别说明
常数表达式必须是常数和常量,不允许为变量
错误示例:int count = 8; int c[count];
数组元素编号从0开始计数,元素访问格式为a[0]、a[1]、…
不允许对数组进行整体赋值操作,只能使用循环逐一复制元素
错误示例三:int a[8], b[8]; a=b;
-
意义与性质
将相同性质的数据元素组织成整体,构成单一维度上的数据序列
数组的地址
数组的基地址:数组开始存储的物理位置
数组首元素的基地址:数组首个元素开始存储的物理地址,数值上总是与数组基地址相同
“&”操作符:&a获得数组的基地址;&a[0]获得数组首元素的基地址
设数组基地址为p,并设每个元素的存储空间为m,则第i个元素的基地址为p+mi
数组元素的初始化
-
基本初始化格式
定义格式:元素类型 数组名称[元素个数] = {值1,值2,值3,…};
示例:int a[8] = {1, 2, 3, 4, 5, 6,7,8};
int a[8] = {,6,7,8};
-
初始化时省略元素个数表达式
在全部元素均初始化时可以不写元素个数,使用sizeof操作符可以获得元素个数
示例二:int a[] = {1, 2, 3, 4, 5,6,7,8};
int num_of_elements = sizeof(a)/sizeof(a[0]);
sizeof(a)获取数据存储空间大小(以字节为单位),sizeof(a[0])获取数组首元素的存储空间大小
数组与函数
-
数组元素作为函数实际参数
int Add(int x, int y){return (x+y);}
int a[2]={1,2}, sum;
sum = Add(a[0], a[1]);
-
数组整体作为函数形式参数
基本格式:返回值类型 函数名称(元素类型 数组名称[], 元素个数类型 元素个数)
示例:void GenerateIntegers(int a[], unsigned int n);
特别声明:作为函数形式参数时,数组名称后的中括号内不需要写元素个数,必须使用单独的参数传递元素个数信息。a[]数组既是输入的一部分也是输出的一部分(简单理解为按地址传递)。
多维数组
-
多维数组的定义
定义格式:元素类型 数组名称[常数表达式1][常数表达式2]…
示例一:int a[2][2]; //2x2个整数元素的二维数组
示例二:int b[2][3][4]; //2x3x4个整数元素数组
特别说明:同单维数组
-
多维数组的初始化
与一维数组类似:int a[2][3] = {1, 2, 3, 4, 5, 6}
单独初始化每一维:int a[2][3] = {{1, 2, 3}, {4, 5, 6}}
结构体
-
结构体的意义与性质
与数组的最大差别:不同类型数据对象构成的集合,当然也可以为相同类型的但具体意义或解释不同的数据对象集合
-
结构体类型的定义:注意类型定义后面的分号
struct 结构体名称
{
成员类型1 成员名称1;
成员类型2 成员名称2;
…
成员类型n 成员名称n;
};
-
结构体类型示例
示例一:日期结构体
struct DATE { int year; int month; int day; };
-
结构体类型的声明
仅仅引入结构体类型的名称,而没有给出具体定义,其具体定义在其他头文件中或本文件后续位置
struct COMPLEX;
- 结构体数据对象的访问
-
结构体类型的变量与常量:按普量通格式定义
示例一:DATE date;
示例二:STUDENT zhang_san;
示例三:STUDENT students[8];
-
结构体量的初始化
示例四:DATE date={2008, 8, 8};
-
结构体量的赋值
与数组不同,结构体量可直接复制,拷贝过程为逐成员一一复制
示例五:DATE new_date; new_date=date;
-
结构体量成员的访问
使用点号操作符"."解析结构体量的某个特定成员
示例一:DATE date;date.year=2008;date.month=8;date.day=9;
-
嵌套结构体成员的访问
可以连续使用点号逐层解析
示例二:
struct FRIEND { int id; STRING name; DATE birthday; }; FRIEND friend; friend.birthday.year = 1988;
-
复杂结构体成员的访问
严格按照语法规则进行
示例三:
FRIEND friends[4]; friends[0].birthday.year=1988;
-
结构体与函数
编写一函数,使用结构体类型存储日期,并返回该日在该年的第几天信息,具体天数从1开始,例如2016年1月20日返回20,2月1日返回32
unsigned int GetDateCount(Date date) { static unsigned int days_of_months[13]= {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; unsigned int i, date_id = 0; for(i=1, i<date.month;i++) { date_id += days_of_months[i]; } date_id += date.day; if(date.month > 2 && IsLeap(date.year)) date_id++; return date_id; }