结构体概述
可以将基本类型组合起来,形成一个新的自定义类型,这种类型称为结构体类型。
例如:
struct Contact
{
int id;
char name[16];
char phone[16];
};
这样,就定义了一个自定义类型Contact,它组合了一个int型数据,俩个char型数组。这种由关键字struct引导的语法称为“结构体”。
struct语法的基本形式为:
struct TypeName
{
Members
};
其中,TypeName是新的类型的名字,Members是成员变量的列表。
(大括号末尾一定要加上分号)
结构体基本用法
变量定义和初始化
可以使用结构体类型作为类型名,来定义一个变量。
1,定义一个变量
Contact a //定义一个变量,不指定初始值
2,定义并指定初始值
和数组的初始值语法类似,可以用大括号将各个成员的初始值列出。如果有多个成员,则需要顺序一致。例如:
Contact b =
{
201501, //id: 一个int值
"Jennifer", //name: 一个char型数组
"13810022334" //phone:一个char型数组
};
指定初始值时:
1,注意使用大括号,末尾要加分号结束。
2,各字段的初始值要与该字段的类型匹配。
3,各初始值的顺序要与成员变量的顺序一致。
4,各初始值以逗号分开,最后一个成员后面不需要加逗号。
和数组一样,可以只初始化部分成员变量,例如
Contact a = { 201501,"John" };
也可以直接清零,一次性将所有字段均置为。
Contact a = {0};
10.3.2 访问结构体的成员
可以使用点号访问结构体变量的成员,例如:
Contact c;
c.id = 201501; //访问c.id
strcpy(c.name, "John"); //访问c.name
strcpy(c.phone, "18601011223"); //访问c.phone
注意:大括号只能用于初始化时,不能再赋值的时候使用。一下的代码是错误的。
Contact b;
b = {201501,"Jennifer", "13810022334" }; //错!赋值时不能使用大括号!
10.3.3 定义结构体数组
可以和基本类型一样,定义数组,表示并排的多个对象。
Contact cs[4];
也可以在定义的同时初始化,注意最后一个成员后面不需要加逗号。
Contact cs[4] =
{
{201501, "John", "18601011223" },
{201502, "Jennifer", "13810022334" },
{201503, "AnXin", "18600100100" },
{201504, "Unnamed", "18601011223" }
};
同样地,数组的元素类型是结构体,所以可以先用中括号[ ]取得元素,然后再用点号访问元素内的成员。例如:
for(int i = 0; i<4; i++)
{
print("id: %d, Name: %s, Phone: %s\n",
cs[i].id, //第i个元素的id的值
cs[i].name, //第i个元素的name的值
cs[i].phone); //第i个元素的phone的值
}
10.5 结构体的更多用法
结构体的赋值
和基本类型的用法类似,结构体类型的变量也是可以相互赋值的,;例如:
Contact a = {20141003, "AnXin", "18600100100"};
Contact b;
b = a; //赋值
结构体指针
在结构体类之后加上* 号,就表示相应的指针类型。例如:
Contact * p = &a; //定义结构体指针
对于指针指向的对象,可以用-〉操作符来访问对象的成员,例如:
p -> id = 20141011; //使用->访问对象的成员
strcpy(p -> phone, "13800100100"); //使用-〉访问对象的成员
注意:也可以写成(*p).id ,但不推荐这么写,通常应该使用->操作符。
10.5.3 作为函数的参数。
和基本类型一样,结构体也可以作为函数的参数。
传值方式
void test (Contact a)
{
printf("id: %d , name: %s \n" , a.id, a.name);
}
传地址方式
void test (Contact * p)
(
printf("id: %d , name: %s \n", p-> id, p->name);
}
下面是函数调用的示例代码。
Contact a = {20141003, "AnXin", "18600100100");
test(a);
test(&a);
作为函数返回值类型。例如:
Contact create (int id)
{
Contact a;
a.id = id;
return a; //像基本类型一样,直接return
};
10.5.5 作为结构体的成员
成员的类型也可以是结构体类型。 例如:
struct Color
{
unsigned char r;
unsigned char g;
unsigned char b;
};
struct Object
{
int x, y;
Color rgb; //此成员是Color类型
};
也可以像下面这样定义Object对象并指定初始值。
Object obj =
{
1
2,
{ 0xff,0x00,0x00}
};
可以像下面这样访问对象obj的成员rgb下面的成员。
printf("obj: (%d, %d)color: # %02x % 02x % 02x \n",
obj.x, obj.y,
obj.rgb.r,
obj.rgb.g,
obj.rgb.b);
10.6.4 C语言中的struct定义
C++对原来的C语言进行了扩展和优化,其中struct语法就做了一些优化。在原来的C语言中,struct的定义是这样子的:
struct Object
{
int x;
int y;
};
Object 类型的定义语法和C++中的一样,但在C语言中定义结构体变量的时候,struct关键字必须要加上。例如:
struct Object a;
struct Object * P;
struct Object objs[128];
这意味着,在C语言中struct Object 必须连在一起写才是一个类型。这个语法是有点啰嗦的。于是在C++中对其进行简化,直接使用Object作为一个类型名。