1.1动态内存分配
先开空间再使用
动态内存申请在 堆区, 推区空间人为申请,人为释放。
用到动态申请就得调用库函数--stdlib.h
申请空间:malloc
释放空间:free
函数申明: void *malloc(size_t size);
函数功能:申请size个字节大小的空间,返回空间地址
例:申请一个int型的空间
int *p;
p = (int *)malloc(4); //一个int型用到4个字节
//(int *)强转,申请到的空间只放int型
*p = 30;
printf("%d",*p);
//用完之后得释放地址,堆区的空间不会自己回收
函数申明:void free(void *ptr);
free(p);
p = NULL;
//NULL 是一个预定义的宏,通常被定义为 (void *)0 或者是一个整数值0。
申请 2 个 int 型的空间大小,对空间进行写,然后再读
int *p = (int *)malloc(sizeof(int)*2);
//如果用两个指针变量定两块空间,那不一定是连续的,*p的内容不超过4字节
//用一个指针变量申请两块空间,这是连续的,*p可以用到这8个字节
*p =100;
*(p+1) = 200;//因为用的连续空间,所以也可以做到指针偏移
printf("%d %d",*p,*(p+1));
free(p);
p = NULL;
补充:
代码区 常量区 全局数据/静态数据区 栈区 堆区
代码 例:10 static 局部变量 动态申请
"hello“ 代码运行整个期间都存在 用的时候开空 人为申请
空间,用完销毁 人为释放
不需要人为干预
二、宏定义
2.定义格式
#define 宏名 代表内容 // #---预处理符 预处理阶段进行宏替换
// 宏定义为了方柏霓代码维护,以及一改全改
#include<stdio.h>
#define bookNum 2000 // 预处理阶段进行 宏替换 常量 变量 表达式
//带参宏
//#define 宏名(参数列表, 不写类型) 表达式
#define GETTHE(x,y) x+y
//使用宏名代表类型 ---给类型起名 u8 u16 u32 unsigned char----不带符号的字符
#define u8 unsignedchar
int main()
{
int = bookNum + 5; //int a = 2000+5
printf("%d\n",bookNum);//printf("%d",2000);
int t = 9;
int k = 10;
printf("%d\n",3*GETTHE(t,k)); //printf("%d\n",3*t+k);---只会运行,不会替换
//如果想要不被别的运算符影响,在宏定义时加括号
u8 z;// unsigned char z;
u8 *x,y;// unsigned char *x,y; x是指针,y是unsigned char 变量
// unsigned char *x,*y; 这样才是两个指针变量
}
2.2程序代码执行
预处理: #
编译: 检查语法错误
汇编: 生成二进制代码
链接: 链接静态动态库 根据不同的平台+不同平台的启动代码
生成可执行代码
运行 -- 才会加载到内存里面去 --- 申请空间 存储数据 执行代码逻辑
2.3const 的用法
1. const 1、修饰变量后,变量的值不能被修 -----变量只读
2、定义时就得给值,即初始化
const int b = 60;
或者
int const c = 80;
2.const 和指针
char str1[30] = "hellow wrold";
char str2[30] = "xxxxxx";
const char *p = str1;// const在*的前面修饰的是指针指向的空间 *p ---- p空间没有限定
printf("%s\n",p);
// *p = 'o'; // 报错 ---因为 *p是只读
p = str2;
printf("%s\n",p);// p是没被限制 可以读写
// const放在*之后修饰的是指针本身的空间 p
// 必须要初始化,不然后面就用不了指针,不能再改变他的指向
char *const q = str1;
printf("%s\n",q);
// q = str2; // 报错 ---- 因为q是只读 ------ 注意const放的位置
*q = 'i'; // *q可以读写
printf("%s\n",q);
总结: const char *p = str1;
char const *t = str1; // *t是只读的,t是可以读写
const char *p和char const *t 有什么区别? -------- 没区别
2.4 static 的用法(关键字 ----- 静态)
static ---局部变量:变量只能初始化一次,位于静态数据区,函数结束空间不会被销毁
全局变量:变量只能当前文件里面使用
函数: 函数只能在当前文件里面使用
#include<stdio.h>
void test(void)
{
static int a = 1;
printf("%d\n",a);
a++;
}
int main()
{
test(); //1 静态数据区 -- a = 1 a++ ;a = 2
test(); //2 static int a = 1; --- 检测到静态数据区已经开过空间,忽略这一条
test(); //3 static int a = 1; --- 检测到静态数据区已经开过空间,忽略这一条
// printf("%d",a);报错 a并没有定义,不能访问,并未改变a事情静态局部变量的属性
return 0;
}
练习: 流水灯
1灯亮
2灯亮
3灯亮
...
5灯亮
void led_flash(void)
{
static int n = 1;
printf("%d灯亮\n",n);
n++;
if(n > 5)
{
n = 1;
}
}
int main(void)
{
while(1)
{
led_flash();
sleep(1);
}
}