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 *)#
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 注意
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中的规则替换变量可以推出)
#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;
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;
}