一:简单结构:

声明和定义:

结构体的成员的数据类型可以不同,把不同数据类型的多个变量当做个整体来使用

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成员占用相同的空间位置,互相擦写,每次只能访问一个成员,所以进行初始化,秩序初始化第一个成员