嵌入式学习记录16

补:

自然边界对齐 

int -- 4字节 --- 能被4整除的地址编号上 

short -- 2字节 --- 能被2整除的地址编号上 

char -- 1字节 --- 能被1整除的地址编号上

1.共用体  (union)

1.1格式:

union 共用体名

{

  成员列表 ;   //  各个变量 

}  ;   //   表示定义一个共用体类型 

注意:

1.2.共用体 

  初始化 --- 只能给一个值,默认是给到第一个成员变量

1.3.共用体成员变量辅助 

  共用体用的数据最终存储的 --- 应该是最后一次给到的值

  但是只能影响到 自己数据类型对应的空间中的数据  // 前面数据类型大;最后一个小,只能影响到自己类型那么多;

1.4.可以判断大小端 

  //    设置两个成员,第一个输入一个长数据,第二个输入一个字符不同于第一个,将两个依次调用,观察第二个数据在什么位置;  

1.5.实际用途 

  a.节省空间 

  b.进行数据转换       :  192.168.1.169 //ip本质是个 32位的数值 

1.6.共用体的大小

 --  是成员变量中最大的那个成员的大小

1.7.共用体类型可以是函数参数,也可以是函数返回值类型 

  共用体,结构体类型定义出来之后,可以做:

    a.定义变量    b.定义数组    c.定义指针     d.做函数参数,返回值类型 

2.枚举  (enum)

2.1.含义

  一枚一枚列举 (  逐个列举 )

如果一个变量只有几种可能的值,则可以定义为枚举类型。

 所谓“枚举”是指将变量的值一一列举出来,  变量的值只限于列举出来的值的范围内。

2.2格式:

(如星期:)

enum   weekday( 枚举类型名 )

{

    sun,     //  名字 --- 代表一个值 --- 符号常量 

    mon,

    tue,

    wed,

    thu,

    fri,

    sat          //    最后一个不加逗号

};

2.3注意:

1.枚举  提高了代码可读性 

2.枚举 本质上是int类型 

  枚举 与 整型 类型兼容 

3.不足

  因为枚举类型 --- 本质上是个整型类型,

  所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中  

4.枚举类型 

  可以做函数 形参 和 返回值 

  定义数组也可以,本质上就是整型数据 

3.链表

数据结构:   数据的组织形式 (逻辑上理解的形式)

数组也是一种数据结构;

数据组织形式 ---会决定使用数据的算法 

3.1数组: //顺序表 

   优点:     随机访问 方便 

   缺点:     增加数据,删除数据    不方便  

3.2链表:   //  链式的数据表    (狗链) 

   优点:     增加 删除数据很方便 

   缺点:  找数据不大方便 

3.3 计算机中:    计算机体现的链式数据结构:

 存放链式数据的结构:   节点 

[数据|另外一个节点指针] :

[数据1|指针]     //   这是一个  节点 

[数据2|指针]     //  数据中存放想要存的东西  

[数据3|指针]

[数据域|指针域]

3.4优点:

               .增加数据,删除数据   方便

3.5操作:

1.创建一个链表 -- 空链表 

  //有头链表  --可以更方便的处理链表

  //无头链表 

1.1 空链表:

 特点:

  只有头节点

注意:
  函数不能返回,局部变量地址 

  并且头节点的指针域 为NULL //相当于是尾节点

strcut Node head = {0,NULL};

struct Node *p = &head;  

2.插入

  创建一个新的节点    节点链接起来

A:  尾插:

    s1.创建一个新的节点

        struct Node *pNew = malloc(sizeof(struct Node)); 

        //放在了堆区   

在堆区自己开辟,自己释放;

  s2.找到尾节点 

       struct Node *p = &head;  //此时p在头节点 

       while( p->next != NULL )

       {

          p = p->next; //让p指向下一个节点 

       }

  s3.链接到尾节点后面

       p->next  = pNew;    

       pNew->next = NULL; //尾节点

B:头插

      void pushFront(struc Node *head,int data)

   {

      //1.创建新节点

      pNew 

      //2.链接 

      pNew->next = p->next;

      p->next = pNew;

   }

3.删除:

   A:头删

         void popFront(struct Node *head)

{

   //1.p指针变量 指向首节点

   //2.断开链表 

      head->next = p->next;

   //3.释放p所在的节点 

     free(p);

  B:  尾删

void void popBack(struct Node *head)

{

   //1.p定位到尾节点的前一个节点 

   while (p->next->next != NULL)

   {

     p = p->next;

   }   

   //2.释放 p->next

   //3.p所在节点成为了新的尾节点 

   p->next = NULL;

}

在堆区开辟的空间必须释放;否则会造成空间的浪费和数据的泄露;

4.位运算:

0 1

计算机 中 :  1Byte --存储单位 

                      1Byte = 8bits

软件控制硬件:编程 -->CPU-->寄存器(位)--硬件关联 

C语言上 位运算 :

1.  & :

     运算规则   :  一假则假   --- 清0 

2.   |  :

     运算规则:一真则真 

3.  ~  :

      运算规则: 真假相对

4.  ^ 异或 :

  运算规则:       相同为0 不同为1   

可以用来加密

  int a = 0x33;

   a ^ 0x55;
   
   0011 0011

   0101 0101 ^

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

   0110 0110     //     0x66

5. << :

   数值<<位数   

   int a = 0x33;      a<<1      位数为几整体向左移几位;也就是(数值位)*(进制的多少次方)数值位是多少进制的数,就    位数位个   进制  

6. >> :

与上面相同只是右移,除多少

注意:右移时要:  看数据类型 

  有符号类型的数据,此时右移 最高位 补符号位 //算术右移 

  无符号类型的数据,此时右移 最高位 补0   //逻辑右移 

置1 操作:

int a = 0x55;

0101 0101 

0000 1000

-----------

0101 1101 //0x5D

a = a | 1<<3;

实现两个数交换:

int a = 10;

int b = 20;

a = a ^ b;  0001 1110  

b = a ^ b;  0000 1010

a = a ^ b;  0001 0100

你可能感兴趣的:(学习)