day_5 动态申请&宏定义

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);

                                        }

                                }

                

                

                        

                

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值