嵌入式学习第十六天

1.结构体:用于承载不同数据类型的容器

结构体定义方法如下:

结构体成员运算符优先级是一级,结合方向是自左向右   "  .  "

还可以用省略结构体标识符的方式来定义,此时定义的结构体只能使用此前定义时的变量名,不能在下面的程序中再定义其他变量名

#include<stdio.h>
struct
{



}s1,s2;

2.结构体初始化

结构体初始化有两种方式,一种是部分初始化,一种是全部初始化,不论是哪种,中间变量名都要用逗号隔开,并且部分初始化要带结构体运算符

部分初始化:struct student s ={.score=96,.name="zhangsan"};
全部初始化:struct student s ={1,95,"lisi"};

3.结构体对齐问题

(1)结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
(2)结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
(3)如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
(4)用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。

结构体对齐设计的初衷是为了提高CPU的执行效率,代价是系统会浪费一部分字节数的空间

4.结构体作为参数传递时,通常使用指针传参,因为在数据量很大的时候,值传递效率很低

5." -> "是指向结构体成员运算符,前面的部分应该为指针类型

6.结构体变量允许整体赋值操作(数组不允许整体引用)

7.输出缓冲区:当数据通过CPU运算过后也不会立即输出,而是放在输出缓冲区内,这样做是为了等待反应慢的那一方能接收数据且不影响CPU的运行效率

当缓冲区里的数据遇到以下三种情况时会直接输出:

(1)遇到\n

(2)fflush(stdout)

(3)缓冲区满时

8.用指针处理链表

链表分为有头链表和无头链表

使用有头链表可以避免指针的指针使用,降低复杂度

使用示例程序:

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
};
void push_front(struct node *phead,int n)
{
    struct node *pnew = malloc(sizeof(struct node));
     pnew->next =  phead->next;
     phead->next = pnew;
     pnew->data = n;
}
/*void printlist(struct node *head)
{
    struct node *p = phead->next;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p = p->next;
    }
}*/
int size(struct node *phead)
{
    int counter=0;
    struct node *p = phead->next;
    while(p!=NULL)
    {
        ++counter;
        p = p->next;
    }
    return counter;
}
int main(void)
{
    struct  node head={0,NULL};
    push_front(&head,1);
    push_front(&head,2);
    push_front(&head,3);
    push_front(&head,4);
//    printlist(&head);
    printf("%d\n",size(&head));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值