int -- 4字节 --- 能被4整除的地址编号上
short -- 2字节 --- 能被2整除的地址编号上
char -- 1字节 --- 能被1整除的地址编号上
union 共用体名
{
成员列表 ; // 各个变量
} ; // 表示定义一个共用体类型
注意:
初始化 --- 只能给一个值,默认是给到第一个成员变量的
共用体用的数据最终存储的 --- 应该是最后一次给到的值。
但是只能影响到 自己数据类型对应的空间中的数据 // 前面数据类型大;最后一个小,只能影响到自己类型那么多;
// 设置两个成员,第一个输入一个长数据,第二个输入一个字符不同于第一个,将两个依次调用,观察第二个数据在什么位置;
a.节省空间
b.进行数据转换 : 192.168.1.169 //ip本质是个 32位的数值
-- 是成员变量中最大的那个成员的大小
共用体,结构体类型定义出来之后,可以做:
a.定义变量 b.定义数组 c.定义指针 d.做函数参数,返回值类型
一枚一枚列举 ( 逐个列举 )
如果一个变量只有几种可能的值,则可以定义为枚举类型。
所谓“枚举”是指将变量的值一一列举出来, 变量的值只限于列举出来的值的范围内。
(如星期:)
enum weekday( 枚举类型名 )
{
sun, // 名字 --- 代表一个值 --- 符号常量
mon,
tue,
wed,
thu,
fri,
sat // 最后一个不加逗号
};
1.枚举 提高了代码可读性
2.枚举 本质上是int类型
枚举 与 整型 类型兼容
3.不足
因为枚举类型 --- 本质上是个整型类型,
所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中
4.枚举类型
可以做函数 形参 和 返回值
定义数组也可以,本质上就是整型数据
数据结构: 数据的组织形式 (逻辑上理解的形式)
数组也是一种数据结构;
数据组织形式 ---会决定使用数据的算法
优点: 随机访问 方便
缺点: 增加数据,删除数据 不方便
优点: 增加 删除数据很方便
缺点: 找数据不大方便
存放链式数据的结构: 节点
[数据|另外一个节点指针] :
[数据1|指针] // 这是一个 节点
[数据2|指针] // 数据中存放想要存的东西
[数据3|指针]
[数据域|指针域]
.增加数据,删除数据 方便
//有头链表 --可以更方便的处理链表
//无头链表
特点:
只有头节点
注意:
函数不能返回,局部变量地址
并且头节点的指针域 为NULL //相当于是尾节点
strcut Node head = {0,NULL};
struct Node *p = &head;
创建一个新的节点 节点链接起来
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; //尾节点
void pushFront(struc Node *head,int data)
{
//1.创建新节点
pNew
//2.链接
pNew->next = p->next;
p->next = pNew;
}
void popFront(struct Node *head)
{
//1.p指针变量 指向首节点
//2.断开链表
head->next = p->next;
//3.释放p所在的节点
free(p);
void void popBack(struct Node *head)
{
//1.p定位到尾节点的前一个节点
while (p->next->next != NULL)
{
p = p->next;
}
//2.释放 p->next
//3.p所在节点成为了新的尾节点
p->next = NULL;
}
在堆区开辟的空间必须释放;否则会造成空间的浪费和数据的泄露;
0 1
计算机 中 : 1Byte --存储单位
1Byte = 8bits
软件控制硬件:编程 -->CPU-->寄存器(位)--硬件关联
C语言上 位运算 :
运算规则 : 一假则假 --- 清0
运算规则:一真则真
运算规则: 真假相对
运算规则: 相同为0 不同为1
可以用来加密
int a = 0x33;
a ^ 0x55;
0011 0011
0101 0101 ^
------------------
0110 0110 // 0x66
数值<<位数
int a = 0x33; a<<1 位数为几整体向左移几位;也就是(数值位)*(进制的多少次方)数值位是多少进制的数,就乘 位数位个 进制
与上面相同只是右移,除多少
注意:右移时要: 看数据类型
有符号类型的数据,此时右移 最高位 补符号位 //算术右移
无符号类型的数据,此时右移 最高位 补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