数据类型:
基本数据类型:
整数类型
浮点数类型
字符型
缺省类型
泊尔类型
构造数据类型:
结构体
共用体
枚举
结构体:
结构体类型定义:
struct 结构体名 {
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};
结构体变量的定义:
数据类型 变量名;
结构体的初始化:
全部初始化:
struct student s = {"zhangsan", 'm', 19, 100};
局部初始化:
struct student s = { .name = "zhangsan", .score = 100, };
结构体元素访问:
结构体访问成员变量最终的类型由成员变量决定
1. 结构体变量访问成员变量:
使用 . 访问
2. 结构体指针访问成员变量:
使用 -> 访问
结构体的存储:
内存对齐:
结构体成员变量只能存放在内存地址为自身基本类型长度整数倍的内存单元中
结构体整体的大小必须为最大类型长度的整数倍
结构体作为函数参数:
结构体数组:
数据类型 数组名[元素个数];
共用体(联合体):
union
共用体与结构体定义、元素访问都是一致的
结构体成员变量空间是独立的,共用体成员变量空间是共享的
内存大小端:
内存低地址存放低数据位称为小端
内存低地址存放高数据位称为大端
枚举
enum 枚举类型名
{
枚举常量1,
枚举常量2,
枚举常量3,
...
};
枚举常量第一个值默认为0,后续枚举常量的值为前一个枚举常量的值+1
位运算符
& 按位与 与0得0
| 按位或 或1置1
~ 按位取反
^ 按位异或 异或取反
>> 右移
<< 左移
让num的第n位置1: num |= 1 << n;
让num的第n位置0: num &= ~(1 << n);
typedef
typedef语法是用来为现有数据类型创建一个新的名字的关键字。
语法格式:
typedef 原始数据类型 新数据类型名字。
通过使用typedef,我们可以使用新的名字来代替原始数据类型,使代码更加美观和可读性更高。
typedef 等价于rename
typedef struct student
{
char name[32];
char sex; int age;
int score;
}stu_t; //定义struct student类型别名为 stu_t
struct student s;
stu_t s;
申请释放堆区空间
malloc
函数
void *malloc(size_t size);
功能:申请堆区内存空间
参数:size:申请空间的大小
返回值: 成功返回申请到的堆区空间的首地址
失败返回NULL
free
函数
void free(void *ptr);
功能:释放申请的堆区空间
参数:ptr:指针指向的空间
返回值:缺省
内存溢出、内存越界
存放的数据空间超过申请的空间大小,操作超过申请空间大小的数据,称为内存溢出、内存越界
内存泄露
malloc申请的空间没有被
free
掉,就会产生内存泄露
练习
1. 使用异或运算符完成两数的交换;
#include <stdio.h>
int main(void)
{
int a = 100;
int b = 200;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
return 0;
}
2.使用共用体实现对内存大小端的判断。
#include <stdio.h>
union s
{
char a;
int b;
};
int main(void)
{
union s s1;
s1.b = 1;
if (s1.a)
{
printf("小端!\n");
}
else
{
printf("大端!\n");
}
return 0;
}