8.1 结构体 共用体 typedef 枚举

typedef :  给类型起一个新的名字

int main()
{
    unsigned int a = 10;
}

可以用下面表示:
typedef  unsigned int   u32_t;
int main()
{
      u32_t a = 10;
}

与definde的区别:
typedef char *  N;

#define N char*

N p1,p2,p3;
define的话  p2 p3 变成了char 类型


结构体 :不同类型元素的汇聚

①匿名结构体
struct{

    int id;  //注意这里是分号

    char sex;

}a,b;    //注意这里不要忘记分号

只能在定义结构体的同时定义变量
struct c       //错误

②有名结构体
struct STU{
    int id;
    char se;
}a;

struct STU b;//正确

③typedef别名结构体
struct STU{
    int id;
    char se;
};

typedef  struct STU  student;
student a,b;


结构体初始化赋值:
①struct STU a = {5 , 'a'};//初始化的时候赋值      要 一 一 对应


②定义之后只能一个一个赋值 
    struct STU b;
    b={ 6 , 'b' };       //错误,只能一个一个赋值 类似数组         不过结构体名字b 不是一个指针
    b.id = 6;
    b.sex = 'b';

相同类型之间的结构体直接赋值            //数组直接不可以直接赋值,可以通过结构体
struct STU c;
c=a;

如果里面有字符串,和数组
字符串要用 strcpy


结构体成员的引用:
.
struct STU a;
a.id = 10;

->  
struct STU a,*p;
p = &a;
p->id = 10;

结构体的存储:

成员都是连续的, 首成员在地址,后面成员在高地址,类似于堆的存储

最小整形变量对齐   4字节/2字节
struct STU{
    int id;           // 4
    char se;         // 4                                         
};
siezof(struct STU)  = 5;//错误  因为 四字节对齐   等于8


结构体数组使用例子:

 
   
  1. #include <stdio.h>
  2. #define N 3
  3. typedef struct STU{
  4. int id;
  5. char name[20];
  6. char sex;
  7. } student;
  8. void init_student(student * p,int n)
  9. {
  10. int i;
  11. char buf[1024];
  12. for(i=0;i<n;i++)
  13. {
  14. printf("please int youre id:");
  15. gets(buf);
  16. p[i].id = atoi(buf);
  17. printf("please int youre name:");
  18. gets(p[i].name);
  19. printf("please int youre sex:");
  20. gets(buf);
  21. p[i].sex = buf[0];
  22. printf("\n");
  23. }
  24. }
  25. void sort_student(student *p,int n)
  26. {
  27. int i,j,min;
  28. student temp;
  29. for(i=0;i<n;i++)
  30. {
  31. min = i;
  32. for(j=i+1;j<n;j++)
  33. if(strcmp(p[min].name, p[j].name) > 0)
  34. min = j;
  35. temp = p[min];
  36. p[min] = p[i];
  37. p[i] = temp;
  38. }
  39. }
  40. void show_student(student *p,int n)
  41. {
  42. int i;
  43. for(i=0;i<n;i++)
  44. {
  45. printf("%d\t%s\t%c\n",p[i].id,p[i].name,p[i].sex);
  46. }
  47. }
  48. int main()
  49. {
  50. student a[N];
  51. init_student(a,N);
  52. sort_student(a,N);
  53. show_student(a,N);
  54. return 0;
  55. }
021636553289966.png


共用体 【联合体】:  union

union ITEM{
    int id;
    char sex;
    short n;
}
union ITEM a;
sizeof(a)    //4     公用体如果存id就不能存其他的,如果存sex,就不能存其他的。


a.id  = 100;
a.sex  = 'm';
a.n  = 20;
后面的覆盖掉前面的

struct something
{
    float price;
    union item{
        char addr[100];  //要么有地址,要么有日期
        char date[50];    //要么柴油,要么汽油
    };
};


枚举:  enum

enum POKE
{
       spade , heart , diamond , club
        //0         1             2             3
};

enum POKE a = club; 
printf("%d" , a);                        //3




转载于:https://www.cnblogs.com/l6241425/p/3951764.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值