C 语言中的数据结构介绍

结构:
    结构变量
        struct{
            int number;
            char name[10];
            int onHand;
        }part1,part2;
    初始化:
        {112,"Disk",10}
        c99中指定的初始化:
            {.number = 112,.name = "Disk",.onHand = 10}//若赋值不完全,则默认为0
   
    结构体
        声明:
        typedef struct part{
            int num;
            char name[10];
            long ld;
        }part;//别名
       
    由于内存分配会将结构中的变量分配到内存的边界上,以方便访问,所以每个成员方的位置是从本身长度的倍数位开始。但本身长度超过4 的,以4计算。此成为对齐。
    
 结构 struct:
    作为参数传递以及返回值,结构变量和基本数据类型(如 int)一样的。
    传递的是结构变量的地址(指针):
        (*指针).成员       指针->成员(常见用法)
   
    对齐:
        分配内存的时候,每个成员都要放在他长度的倍数位置,如果不够,补位对齐,
            若大于4,则为4。
    补齐:
        对整个结构变量的空间要求总长度一定是最长的成员的倍数,不够补齐。
      不管是对齐还是补齐,最长的成员长度超过4,以4计。
      数组成员以数组元素的长度计算,而不是以数组的整个长度。
   
    位段(位域):本质上是一个结构
     struct switch{//最后会补齐成int的倍数
         int s1:1;   //占一个二进制位
         int s2:1;
         int s3:1;
     };
        用二进制位对结构的成员进行内存分配。(一般在程序中不太使用,效率低)。
        但可以节省内存的使用,经常用在内存受限的地方。
    
 联合 union:(是一个公共的单元)
  使用方式和结构一样,通过.运算操作成员。
  所有成员的首地址相同。 用不同的视角解释一片内存,在一定情况下可以节省内存。
     
 枚举 enum:(是常量,默认从0开始) 
  C语言中的枚举类型等同于int类型,枚举值就是int型的常量,类似于const int定义的常量值,也等同于整形字面值(如 1,2,3,4)
  使用枚举可以提高程序的可读性,方便编程。
  
 C语言中的结构、联合、枚举都不同于C++中的结构、联合和枚举。可以这么说,C++中的
  结构、联合和枚举兼容于C,但功能比C更多,要求也更严格。

数组:
 一维数组:
    访问一个不存在的元素,可能导致断错误,可能破坏数据
    编译时不会检查越界。
    在函数传递时指向同一个地址,不再重新分配空间。在形参出可以不指出数组的大小,一般会把数组的
        大小用变量分开传递。(eg:(int a[] ,int n))
    初始化:
        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        但不可以是:int a[10];
                  a = {1,2,3,4,5,6,7,8,9,0};
        int c[10] = {1,2,3,4,5}//后面的数据为0
        int c[10] = {};//是垃圾数据,不一定是0
       
        int d[5] = {1,2,3,4,5,6,7}//多余的数据会自动丢弃,会出现警告
       
        int d[] ={1,2,3,4,5}//编译器会自己计算长度来确定数组的大小。
       
        int d[10] = {0};//通常用该法初始化数组
       
        数据之间的赋值必须是单个数据赋值,不能直接赋值(eg:a = c)

  二维数组:
    初始化:  int a[3][4] = {0};//全部初始化为0
            int a[2][3] ={{1,2,3},{4,5,6}};
            int a[2][3] ={{1,2},{4,5,6}};//缺少的用0补
            int a[2][3] ={{1,2,3,4,5};//最后一个用0补
     在函数传递时必须指定第二维的大小,第一维的大小用参数传递。因此二维数组的传递时只能是第二维
        大小相同才可以,否则会出现错误。
    eg: 形参为: f(int a[][4] ,int n)
        实参必须为: f(a,m)   但a数组的定义中必须为:int a[5][4]; a[4][4]......  

  字符串数组:
    char ss[2][4] = {"abc","def"};//栈里面分配的,可以修改
        strcpy(ss[0],"ccc");
        //ss[0] = "ccc"; //错误,相当于改变数组名
       
    //数组本身在栈区,字符串在代码区
    char *ss[3] = {"aaa","bbb","ccc"};
        //strcpy(ss[0], "abc"); //错误,在修改代码区
        ss[0] = "ABC";//相当于改变指针的指向
       
    用第一种字符串数组更好
   
    多维数组:
   
    数组可以是任意维数的。
    C语言是按照行主序存储数组的。
    多维数组的初始化:
        初始化时没有足够的数字填满数组,则补0;
        甚至可以省掉内存的花括号
   
    本质上和一维数组是一样的,但形式上不一样。

    变长数组:c99中才允许
   
    数组:
    含有多个数据值的数据结构。
    每个数据值具有相同的数据类型,这些数据成为元素。
    下标:
        1、从0开始
        2、c语言不检查下标的范围, 当越界访问时,结果不可预知
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值