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之前定义
以上是结构体的一些基本知识点,可以参考;