天天看点

C++基础知识(三)

数组

数组的意义与性质

  • 数组的定义

    定义格式:元素类型 数组名称[常数表达式]

    示例: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;

  • 结构体数据对象的访问
  1. 结构体类型的变量与常量:按普量通格式定义

    示例一:DATE date;

    示例二:STUDENT zhang_san;

    示例三:STUDENT students[8];

  2. 结构体量的初始化

    示例四:DATE date={2008, 8, 8};

  3. 结构体量的赋值

    与数组不同,结构体量可直接复制,拷贝过程为逐成员一一复制

    示例五:DATE new_date; new_date=date;

  4. 结构体量成员的访问

    使用点号操作符"."解析结构体量的某个特定成员

    示例一:DATE date;date.year=2008;date.month=8;date.day=9;

  5. 嵌套结构体成员的访问

    可以连续使用点号逐层解析

    示例二:

    struct FRIEND
    {
    	int id;
    	STRING name;
    	DATE birthday;
    };
    FRIEND friend;
    friend.birthday.year = 1988;
               
  6. 复杂结构体成员的访问

    严格按照语法规则进行

    示例三:

    FRIEND friends[4];
    friends[0].birthday.year=1988;
               
  7. 结构体与函数

    编写一函数,使用结构体类型存储日期,并返回该日在该年的第几天信息,具体天数从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;
    }
               

继续阅读