• c语言基础学习09_关于复合类型的复习


    =============================================================================
    struct A
    {
      char array[100];   //array不知道在哪里呢?只是告诉c语言编译器有这么一种类型结构。是一种语法形式,不要误解。
      int a;
    };

    struct B
    {
      char *p = malloc(100);   //所以不能这样写!
      nt a;
    };

    int main()
    {
      struct A a;    //此时的array在栈里面。
      a.a;

      struct A *p = malloc(sizeof(struct A));    //此时的array在堆里面。此时只有一个堆。
      p->a;   //只有一个堆的时候可以用箭头->。

      return 0;
    }
    --------------------------------------
    struct C    //占用1个字节,至少1个字节。
    {
      char a : 2;
      char b : 4;
    };

    struct D
    {
      char a : 10;   //错误的语法,char不能超过8个bit。
      char b : 4;
    };

    struct F    //占用8个字节。
    {
      char a : 2;
      int b : 4;
    };
    -----------------------------------------------------------------------------
    struct ABC
    {
      int a;
      int b;
    };

    struct ABC abc1 = { 1, 2 };
    struct ABC abc2 = abc1;    //浅拷贝,就是一个简单内存拷贝而已。
    --------------------------------------
    char array[100] = "hello";
    char array2[100];
    array2 = array;    //不能这么赋值,因为数组名是一个常量,不能作为左值的。
    --------------------------------------
    struct STR
    {
      char array[100];
    };

    struct STR str1 = {"hello"};
    struct STR str2;
    str2 = str1;   //此时str2里面的array的值和str1里面的array值是一样的。因为str2和str1是一个变量名,可以作为左值的。
    -----------------------------------------------------------------------------
    数组最大的缺点是:如果往数组的两个成员之间插入新的数据,代价很大。因为它的内存是连续的。
    而使用堆中的指针变量,只需要添加下,然后让指针重新做一个指向即可。好处:不仅可以做一个有特别多成员的结构,同时还可以自由地去删除、添加元素。
    如下图所示:


    -----------------------------------------------------------------------------

    联合体的常用功能:做可变类型。因为他可以放很多类型,在同一时刻,只有一种类型。
    类似于:javascript中好多变量是没有数据类型的。c语言可以通过联合体来实现。
    (没有数据类型等价于有好多好多数据类型)
    linux下示例代码:

     1 #include <stdio.h>
     2 
     3 union A
     4 {
     5     int a;
     6     //double b;
     7     char b;
     8 };
     9 
    10 int main()
    11 {
    12     union A a;
    13     a.a = 0;
    14     a.b = 100;
    15     printf("%d
    ", a.a);    //100
    16 
    17     return 0;
    18 }

    -----------------------------------------------------------------------------

    注意:不要把一个庞大的结构体作为函数的形参,因为在栈里面一定会有一个结构体变量赋值的过程。就是把实参的值赋值给形参,实际上是一个内存拷贝,代价很大。

    -----------------------------------------------------------------------------

    #define PAI 3.14
    double a = PAI;
    --------------------------------------
    常量是个有限的范围时,一般用枚举enum。
    --------------------------------------
    typedef struct STR S;   //这样S就和int类似了,就成了一个具体的数据类型了。
    S s1;
    sizeof(S);
    S *p = malloc(sizeof(S));
    =============================================================================

  • 相关阅读:
    071:【Django数据库】ORM聚合函数详解-Avg
    实战:百度知道营销,自问自答技巧(下)
    实战:百度知道营销,自问自答技巧(上)
    QQ群排名霸屏技术居然是这样简单
    百度云盘,资源引流的温床,你绝对值得拥有!
    PC时代 常用搜索引擎高级指令 勿忘
    免费影视资源 日引不说几百上千 反正绝对不会是零
    QQ兴趣部落 大批量引流实战技巧
    新媒体运营之话说如此操作更容易出站街号。
    QQ群认证 人数再度扩容 权限随之升级
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8322353.html
Copyright © 2020-2023  润新知