zoukankan      html  css  js  c++  java
  • c语言关键字-struct,union,enum及柔性数组

    一、struct关键字与柔性数组

    • c语言中的struct可以看做变量的集合,struct中的每个数据成员都有独立的存储空间
    • 柔性数组:柔性数组在C99中也称之为伸缩型数组,是C99的扩展,简言之就是struct结构里的标识占位符(不占用struct的空间),柔性数组的结构只能在堆上生成。
      • 声明柔性数组的规则
        • 柔性数组成员必须为结构(struct)中的最后一个成员
        • 结构中至少有一个其他成员
        • 柔性数组就像普通数组一样被声明,除了它的方括号内为空
        •  1 struct softarry
           2 {
           3 int len;
           4 int arry[];
           5 };
           6 
           7 int main()
           8 {
           9 printf("%d
          ",sizeof(struct softarry));
          10 return 0;
          11 }
          12 
          13 输出结果为4(默认在32位机器上)
          编译器不为arry分配内存空间,因为也不知道arry有多大,只是用来当作一个标识符,以便以后可以通过这个标识符来访问其中的内容。
      • 柔性数组的使用涉及到结构指针的使用,下边以例子讲解柔性指针的使用
        •  1 #include<stdio.h>
           2 #include<malloc.h>
           3 typedef struct softarry
           4 {
           5 int len;
           6 int arry;
           7 } my_softarry;
           8 
           9 my_softarry* creat_softarry(int size)
          10 {
          11 my_softarry *ret=NULL;
          12 if(size>0)
          13 {
          14 ret=(my_softarry*)malloc(sizeof(my_softarry)+sizeof(int)*size);
          15 ret->len=size;
          16 }
          17 return ret;
          18 }
          19 
          20 void delete_softarry(my_softarry **sa)
          21 {
          22 free(*sa);
          23 *sa=NULL;
          24 }
          25 
          26 /*给柔性数组每个元素赋值*/
          27 void func(my_softarry *sa)
          28 {
          29 int i=0;
          30 if(NULL!=sa)
          31 {
          32 for(i=0;i<sa->len;i++)
          33 {
          34 sa->arry[i]=i+1;
          35 }
          36 }
          37 }
          38 
          39 int main()
          40 {
          41 int i=0;
          42 my_softarry*sa=creat_softarry(10);//初始化结构指针
          43 fun(sa);//使用柔性数组
          44 for(i=0;i<sa->len;i++)
          45 {
          46 printf("%d",sa->arry[i]);
          47 delete_softarry(&sa);//释放操作柔性数组的结构体指针
          48 return 049 }
          50 }
        • 这里讲解size=5的情况,malloc请求申请的堆空间应为sizeof(my_softarry)=4+sizeof(int)*size=4*5=20==>24
        • sizeof(my_sofyarry)得到的空间用于存放len,二sizeof(int)*size得到的空间用于存放柔性数组的内容,同时柔性数组的长度信息已由len指定。也就是说柔性数组在声明时并不知道其具体大小,而是在使用时通过结构指针来动态指定的



    二、union关键字

    1. union与struct比较
    • c语言中的union在语法上与struct相似。union是一种在同一存储空间内存储不同类型数据的数据类型。它主要被用来存储某种既没有规律事先也不知道顺序的混合数据类型。
    • 不同的是union只分配最大成员的空间,所有成员共享这个空间 
    •  1 struct A
       2 {
       3 int i;
       4 char c;
       5 }
       6  union B
       7 {
       8 int i;
       9 char c;
      10 }
      11 
      12 printf("%d%d",sizeof(struct A),sizeof(union B));
      13 
      14 输出结果为:54

       因此union只分配最大成员空间,且所有成员共享这一空间。即共用同一个内存首地址,同时共用体的成员都可以对这份空间进行操作,操作也是共同生效。

      2.union系统大小端问题

    • 问题引出应用场景
      • 1 union C
        2 {
        3 int i;
        4 char c;
        5 }
        6 unio C c;
        7 c.i==1;
        8 printf("%d",c.c);
        9 此时输出的值应该为多少
    • 大小端模式
      • 小端模式:低地址存储低位数据
      • 大端模式:低地址存放高位数据
          • 在上述程序中,已经将c.i=1;它在内存中的存储方式有上述两种方式
            • 小端模式:c.c=1;
            • 大端模式:c.c=0;
    • 如何检测系统大小端,以下面程序为例
      •  1 #includ <stdio.h>
         2 /*检测处理器大小端,大端模式返回0,小段模式返回1*/
         3 int checkcpu()
         4 {
         5 union w
         6 {
         7 int a;
         8 char b;
         9 } c;
        10 c.a=1;
        11 return(c.b==1);
        12 }
        13 
        14 int main()
        15 {
        16 printf("%d",checkcpu());
        17 return 0;
        18 }



    三、enum枚举类型关键字

    • enum 是c语言的一种自定义类型,将枚举引入的目的是为了提高程序的可读性
      • 1 enum color
        2 {
        3 RED;
        4 BLUE=2;
        5 GREEN;
        6 };
        7 
        8 其中RED=0;BLUE=2;GREEN=3
      • enum变量的类型实际上是int类型
      • 枚举类型中第一个定义的值默认为0;(手动指定的除外)
      • 默认情况下后续定义的值为在前一个的基础上+1 
    • enum关键字注意:
      • 不能对枚举变量进行赋值操作(定义枚举类型时除外)
      • 一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行强制类型转换才行。
  • 相关阅读:
    unix/linux中如何在vi编辑器中方便的跳转到首行和末行?
    如何在Ubuntu中用firefox浏览器查看chm文档?
    sybase数据库技术 :游标可更新与for read only/for update
    PropertyMetadata和UIPropertyMetadata的一点区别
    wpf,离线状态下部分功能不可用。
    C#操作注册服务卸载服务启动服务停止服务.. .
    ContentControl与ContentPresenter区别?
    wpf telerik中的book控件
    C#写入和读出文本文件
    WPF 点击Calendar后,需要点击两次按钮
  • 原文地址:https://www.cnblogs.com/southcyy/p/10172486.html
Copyright © 2011-2022 走看看