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\n",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 0;
        49 }
        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

原文地址:https://www.cnblogs.com/southcyy/p/10172486.html

时间: 2024-10-07 06:56:36

c语言关键字-struct,union,enum及柔性数组的相关文章

C语言变长消息定义:柔性数组

在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的. 一般的做法是定义一个char*类型的指针,然后指定其长度,代码如下: typedef struct{ unsigned len; char* pData; }Msg; 使用的时候是这样的: char str[] = "hello world!"; unsigned len = sizeof(str); Msg* m = (Msg*)malloc(sizeof(Msg)+

C语言的struct/union字节对齐

C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节. 2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值. 3.指定对齐值:#pragma pack (value)时的指定对齐值value. 4.数据成员.结构体和类的有效对齐值:自身对齐值

程序猿之---C语言细节29(#define宏大小、空结构体大小、柔性数组不知道你见过没)

主要内容:#define宏大小.空结构体大小.柔性数组 一.#define宏大小 见例子 二.空结构体大小 根编译器有关 三.柔性数组 不常用,可看看 #include <stdio.h> #define N 4 #define STR "abcd" int main() { struct student { }stu; printf("N = %d\n", sizeof(N)); printf("num 5 memery = %d\n&quo

C语言柔性数组

柔性数组:数组大小待定的数组.C语言中结构体最后一个元素可以是大小未知的数组.C语言可以由结构体产生柔性数组 柔性数组的结构如何只能堆上生成 柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间). #include <stdio.h> #include <malloc.h> typedef struct _soft_array { int len; int array[]; }SoftArray; int main() { int

c柔性数组结构成员

C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员.柔性数组成员允许结构中包含一个大小可变的数组.sizeof返回的这种结构大小不包括柔性数组的内存.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小. 结构体变长的妙用——0个元素的数组 有时候我们需要定义一种可变长结构体. typedef struct st_type  {  int nCnt;  i

读书笔记-C语言关键字

001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内,一个变量或者对象只能定义一次,并且定以后为它分配的内存不可变: 声明:1.告诉编译器这个名字已经和一片内存匹配上了,并且这个内存是在其他地方定义的,声明可以多次:2.告诉编译器,这个名字已经占用,不能再用来定义其他变量或者对象了. 备注:定义创建了对象,并为它分配了内存,声明没有分配内存 2. 关

C语言关键字 (二)

10. goto 关键字 一般来说,编码的水平与 goto 语句使用的次数成反比. 个人主张,禁用 goto 语句. 11. void 关键字 1.void 修饰函数返回值和参数 1> 如果函数没有返回值,那么应将其声明为void 类型. 2> 如果函数无参数,那么应声明其参数为void 2.void 指针 1> 不能对void 指针进行算法操作 2> 如果函数的参数可以使任意类型指针,那么应声明其参数为 void* 3.void不能代表一个真实的变量 12. return 关键字

C语言关键字

常用c语言关键字 C 语言标准定义的32 个关键字:auto 声明自动变量,缺省时编译器一般默认为autoint 声明整型变量double 声明双精度变量long 声明长整型变量char 声明字符型变量float 声明浮点型变量short 声明短整型变量signed 声明有符号类型变量unsigned 声明无符号类型变量struct 声明结构体变量union 声明联合数据类型enum 声明枚举类型static 声明静态变量switch 用于开关语句case 开关语句分支default 开关语句中

李洪强iOS开发之OC[016]C语言关键字

// //  main.m //  04 - C语言关键字 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All rights reserved. // C语言关键字 A -  数据相关 1) 基本数据类型(5个) void    空   没有的意思 char    字符 占 1个字节(char的本质也是数字) int     整数  4个字节 float   浮点数  (小数点)保留7位有效数字 double