一:简单结构:
声明和定义:
结构体的成员的数据类型可以不同,把不同数据类型的多个变量当做个整体来使用
struct coord{ int x; int y; };
关键字struct不能省略,注意{}后面的;不能省略 上述代码只是声明了一个结构体,并没有创建结构实例
struct coord{ int x; int y; }first,second;
struct coord{
int x;
int y;
};
struct coord first,second;
//结构体支持实例直接赋值 first = second;
上面两种声明结构实例方法
使用typedef typedef struct{ int x; int y; }coord;
coord first,second;
//跟上面比较,上面声明结构实例,必须使用struct关键字
使用typedef给结构体创建别名coord,直接使用coord声明结构的实例,不用加struct关键字,简化代码
二:复杂的结构
1.包含结构的结构体
struct rectangle{
struct coord first;
struct coord second;
}mybox;
或者struct rectangle mybox;
访问: mybox.first.x
2.包含数组的结构体
struct coord{
int a[3];
char b[5];
};
struct coord mybox;
访问:mybox.a[1]
3.结构数组
struct entry{ char name[10]; char phone[12]; }; struct entry list[100];
list[1]=list[5]; //把list[5]结构中的每个成员赋值给list[1]结构的相应的成员;
list[1].phone = list[5].phone //吧list[5].phone中的字符串 赋值给list[1].phone 访问数组名的形式,直接是是整个字符串,所有元素
list[1].phone[1] = list[5].phone[2] //单个元素的赋值
声明了一个名为list的数组,该数组包含100个元素,每个元素都是entry类型结构的数组
list[1].phone[2]=list[4].phone[5]
4.初始化结构
struct customer{ char firm[20]; char contact[25]; }; struct sale{ struct customer buyer; char item[20]; float amount; }; struct sale mysale; mysale ={{"yuanyuan","bangbang"},"bangyuan",100.00};
5.结构和指针
可以声明结构成员是指针,也可以声明指向结构的指针
struct data{ int *value; int *rate; }; struct data first; first.value = &const; //给指针赋值 first.rate = &interest; *first.value *first.rate //取值操作
指向char类型的指针是作为结构成员使用最频繁的指针,字符串可以存放在数组中,数组名是指向字符串首字母的指针,,也可以声明一个指针,指向字符串
char *p ; char a[]; p="hello c"; a[]="hello c" 或者a[]={'h','e','l','l','o',,'c'} 在上面的声明中 *p和a[] 是等价的;
struct msg{ char p1[30]; char *p2; //使用指针之前,一定要进行初始化; }; struct msg myptrs; myptrs.p1 = "hello bangbang"; myptrs.p2 = "hello yuanyuan";
这两者的区别:如果声明一个包含char类型数组的结构,除了要指定数组的大小,在声明该类型结构实例的时候,还要为数组分配存储空间,并且,不能在结构中储存超过指定大小的字符串
但是声明char类型的指针就没有上述限制,只需为指针分配存储空间,实际的字符串被储存在内存的别处(这个不用关心),没有长度的限制,也不会浪费存储空间,指针可以指向任意长度的字符串,虽然实际的字符串并没有存储在结构中,但是他们仍然是结构的一部分
6.创建指向结构的指针
在需要把结构作为参数传递给函数的时候,通常用指向结构的指针
struct part{ short number; char name[10]; }; struct part *p_part;//声明了一个指向part结构的指针 ,并没有创建实例 struct part gm;//创建实例 p_part = &gm 访问结构成员: (*p_part).number = 100; //必须用()括起来,因为.运算的优先级高于* 间接运算符-> p_part->number = 100; 结构指针运算符->
7.使用指针和结构数组
struct part{ short number; char name[10]; }; struct data[100]; struct part *p; p=&data[0]; 或者 p=data 由于数组名也是指向数组第一元素的地址的指针 遍历打印整个数组 p++ 相当于p+=sizeof(obj);指针算术 自增 是增加一个元素的字节数,直接指向下一个元素的地址
二.联合 union
声明喝定义和结构是一样的,,每个union成员占用相同的空间位置,互相擦写,每次只能访问一个成员,所以进行初始化,秩序初始化第一个成员
浙公网安备 33010602011771号