结构体理解与应用

  1. 知道为什么要结构化信息
    下面用代码说明一个简单的表格
int id[4]={201501,201502,201503,201504};
char name[4][16]={"ssss","DDCAS","ADSD","aDSA"};
char phone[4][16]={"1314342525","1314342525","1314342525","1314342525",};

这种方法表达一个表格信息,表示的信息不直观,最重要的是数据的存取不方便,比如要按id来查找一个人,那么用上面这种方式存储信息,来显示查找结果就要对下面函数的每个传入参数都输出,就会很麻烦。要写个函数
int find(int id,char name[],char phone[]){};

于是就可以用下面一种想法:有一种新的数据类型,直接表示联系人所有属性。
比如定义新的数据类型 Contact

Contact persons[4];//Contact就是一种新的结构体类型
Contact find(int id);//根据id查找,返回的就是Contact对象
或者下面代码
int find(int id,Contact* p)//

 2. 接触结构体struct
 struct可以产生新的数据类型,所以也叫“自定义类型”
 对于上面的信息,可以定义如下形式

struct Contact
{
int id;
char name[16];
char phone[16];
};
//定义了一个新的数据类型Contact,拥有3个成员变量

上面定义的新的数据类型可以有如下使用方法
1.Contact c;
2.Contact cs[4];
3.Contact* pc=&c;
4.void test(Contact c);
5.Contact make(int id);

 3. 结构体的定义和初始化
 对上面定义的新的结构体初始化如下:
 Contact a={
 201501,
 “jenner”,
 “15340528446”
 };
 注意三点:使用大括号,末尾加分号;各个字段初始值要与定义结构体的字段顺序匹配;初始值用逗号隔开;

 也可以初始化直接赋值0
 Contact a={0};
 下面用结构体对最开始的表格赋初始值。

int main()
{
Contact cs[4]={
{201501,”john”,”18601011223”},
{201502,”jennifer”,”182564652”},
{201503,”jennifer”,”182564652”},
{201503,”jennifr”,”182564652”}
}
return 0;
}

这种初始化方式就清晰明了的表达了最开始的表格的信息



 5- 结构体更多的使用方法

 - 结构体是可以相互赋值的,就和类的对象一样
 int main()
{
    Contact a = { 2013210, "liujiang", "1892345233" };
    Contact b = a;
    Contact* p = &a;

    return 0;
}

 - 结构体作为函数参数(两种形式)
 void tset(Contact a)
{
    printf("id:%d,name:%s", a.id, a.name);
}
void tset(Contact* p)//Contact前面加了const,则这个结构体的值只允许读,不允许写
{
    printf("id:%d,name:%s", p->id, p->name);
}
在C++中,尽量只用下面一种传地址的方式来写函数,这样传递效率高。

 - 作为函数返回值
 Contact make(int id)
{
    Contact a;
    a.id=id;
    return a;
}
但是我们常常写成下面形式
void make(int id,Contact* a)
{
    a->id=id;
}
原因:

*结构体之间只支持=,不支持加减乘除(利用重载操作可以支持)

 - 理解结构体大小
 结构体的大小跟成员变量有关,但比成员变量之和要大,因为编译器会对结构体类型进行填充,以保证结构体大小是4的整数倍。

 - 结构体可以作为下一个结构体的成员变量
 struct Score
 {
 };
struct Student
{
Score score;
};
注意,Score必须在Student之前定义

以上是结构体的一些基本知识点,可以参考;

你可能感兴趣的:(C++基础知识)