嵌入式学习——C语言基础——day14

本文详细介绍了C语言中的共用体、结构体、内存大小端判断、枚举类型、位运算以及内存管理,包括malloc和free的使用,以及数组和链表的区别与基本链表的定义。
摘要由CSDN通过智能技术生成

1. 共用体

1.1 定义

    union 共用名 {
        数据类型1 成员变量1;
        数据类型2 成员变量2;
        数据类型3 成员变量3;
        ..
    };

1.2 共用体和结构体的区别

        1. 结构体每个成员变量空间独立

        2. 共用体每个成员变量空间共享

1.3 判断内存大小端

        1. 内存大端:内存低地址处存放高数据位,内存高地址处存放低数据位

        2. 内存小端:内存低地址处存放低数据位,内存高地址处存放高数据位

        3. 主函数中判断内存大小端

#include <stdio.h>
 
int main(void)
{
	int num = 0x11223344;
	char *p = (char *)&num;
 
	if (0x11 == *p)
	{
		printf("大端!\n");
	}
	else if (0x44 == *p)
	{
		printf("小端!\n");
	}
 
	return 0;
}
 

        4. 利用共用体判断内存大小端

#include <stdio.h>
 
union u 
{
	char a;
	int b;
};
 
int main(void)
{
	union u u1;
 
	u1.b = 1;
 
	if (u1.a)
	{
		printf("小端!\n");
	}
	else 
	{
		printf("大端!\n");
	}
 
	return 0;
}
 

2. 枚举

2.1 定义

        enum 枚举类型名

{        

        枚举常量1,

        枚举常量2,

        ......

};

        例1

#include <stdio.h>

enum stu
{
    one = 1,
    two,
    three,
};

int main(void)
{
    printf("%d\n", one);

    return 0;
}

        例2

#include <stdio.h>

enum Weekday 
{
    MONDAY = 1,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

int main() 
{
    enum Weekday today;

    today = WEDNESDAY;// 给变量赋值

    printf("today = %d\n", today);

    return 0;
}

2.2 注意

        1. 枚举变量的值在枚举常量中选择其一作为它的值

        2. 枚举常量默认为int类型,第一个枚举常量的值默认为0,后续枚举常量的值为前一个枚举常量的值+1

3. 位运算(重点)

&        按位与    

        1. 与0得0、与1不变)(全1为1,有0得0)

        2. 指定位置0

        3. 将字节中第n位置0

            P0 &= ~(1 << n);

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置0:

            P0 &= ~((1 << n) | (1 << m));

|        按位或

        1. (或1得1、或0不变)(全0为0,有1得1)

        2.  指定位置1

        3. 将字节中第n位置1

             P0 |= (1 << n);

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置1:

             P0 |=  ((1 << n) | (1 << m));

^        按位异或

        1. (相同为0、相异为1)    (异或1翻转原位, 异或0原位不变)

        2. 指定位翻转

        3. num ^ num == 0        num ^ 0 == num

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)翻转:

            P0 ^= ((1 << n) | (1 << m));

        5. 交换两数(根据3中的规则替换变量可以推出)(c语言中不使用第三方变量)

#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

~        按位取反

<<        左移

>>        右移                

                   (算数右移:有符号signed  正数左补0  负数左补1)
                 (逻辑右移:移动不考虑正负

4. 内存管理

4.1 内存分区管理

4.2 堆区空间的开辟和释放

(1)malloc

        1. 定义        

                void *malloc(size_t size);

        2. 功能

                申请堆区空间

        3. 参数

                size:申请堆区空间的大小

        4. 返回值

                成功:返回堆区空间的首地址

                失败:返回NULL

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int *p = NULL;

	p = malloc(4);
	if (NULL == p)
	{
		printf("malloc failed!\n");
		return -1;
	}

	*p = 100;
	printf("*p = %d\n", *p);
	
	free(p);

	return 0;
}

(2)free

        1. 定义

                void free(void *ptr);

        2. 功能

                释放堆区空间

        3. 参数

                ptr:堆区空间首地址

        4. 返回值

                缺省

4.3 内存溢出、内存泄漏、内存碎片

        1. 内存溢出:也称内存越界,操作超过变量范围的空间数据

        2. 内存泄漏:malloc申请的空间没有使用free释放

        3. 内存碎片:由于频繁malloc和free小空间,导致大的连续空间由于中间存在小空间被占用而无法得到申请空间的现象称为内存碎片

4.4 数组和链表的区别

        1. 数组

                1. 空间连续(访问数据方便、空间必须连续)

                2. 数组元素必须是有限

                3. 数组插入、删除元素效率低

        2. 链表(实现增删改查)

                1. 空间不需要连续(访问数据麻烦、空间不需要连续,可以使用小的分散空间)

                2. 链表元素可以没有上限

                3. 链表插入、删除元素效率高

4.5 链表的分类

        1. 有无头分为:有头链表和无头链表

        2. 方向性:单向链表和双向链表

4.6 链表的定义

#include <stdio.h>
#include <stdlib.h>

typedef int datatype;						//定义链表存放数据的类型 

typedef struct node							//链表节点类型
{
	datatype data;							//存放数据
	struct node *pnext;						//下一个节点的地址
}linknode;//不加typedef时为定义变量,加typedef时为struct node起了一个类型别名

linknode *createlinklist(void)
{
	linknode *ptmpnode = NULL;

	ptmpnode = malloc(sizeof(linknode));
	if (NULL == ptmpnode)
	{
		printf("malloc failed!\n");
		return NULL;
	}

	ptmpnode->pnext = NULL;

	return ptmpnode;
}

int main(void)
{
	linknode *plinklist = NULL;

	plinklist = createlinklist();

	return 0;
}

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值