• 让我们一起回顾一下C语言吧


    单片机程序中:使用const就自动将常量存到Flash中了,否则一般都存到RAM中。

    readwrite data memory是RAM,全局变量、堆栈全靠RAM;

    readonly data memory应该是常量的Flash (ROM);

    readonly code memory是Flash占用大小;

    c语言实用位操作

    &:按位与      ~:取反        |:按位或      <<:左移   >>:右移    

    清零操作:&运算实现清零--------GPIOA->ODR&=0XFF0F;//将4-7位清零

    置一操作:|运算实现置一---------GPIOA->ODR|=0X0040;//将第6位置一

    实用移位操作可以提高代码可读性----GPIOA->ODR|=1<<5;//第五位置一

    宏定义define讲解:

    1:不带参数的宏定义      格式:#define 标示符    字符串

    作用:在编译预处理时,将源程序中所有的标示符换成字符串

    例如:

    #define PI 3.148        //PI即为3.148

    #define uchar   unsigned char    //在定义数据类型时,uchar 等效于 unsigned char 

    注意:编译与处理时,不做语法检查,只是简单的字符替换,只有在编译时才对已经展开宏名(比如已经将源程序中的PI替换成3.148)的源程序进行语法检查

    宏定义时可以引用已经定义的宏名:

    #define PI 3.148 

    #define X 2.0

    #define ALL   PI*X

    2:带参数的宏定义      一般格式:#define  标示符(参数表)   字符串

    作用:在编译预处理时,将源程序中所有标示符替换成字符串,并且将字符串中的参数用实际用的参数替换

    例如:#define s(a,b)  (a*b)/2

    若程序中使用了s(3,4),在编译预处理时,将替换为(3*4)/2

    extern:

    C语言中extern可以置于变量和函数之前,用以表示变量或则函数定义在别的文件中,提示编译器遇到此变量和函数时在其他模块寻找定义。

    注意:extern声明变量可以多次,但是定义只有一次

    变量存储类型:

    auto型:在动态存储区中      register型:在寄存器中     satic型和extern型;在静态存储器中  

    局部变量默认存储类型:auto     全局变量默认存储类型:extern 

    auto和register型只用于定义局部变量

    static型即可定义局部变量(值将被保留,而且只第一次进入此函数时初始化该变量,也就是只操作一次),也可定义全局变量,定义全局变量时它的有效范围

    为它所在的源文件,其他源文件不能使用

    注意:auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放

    函数:

    若函数存储类型为satic型,则为内部函数或静态函数,该函数只能在其所在的文件中使用,在其他文件终不能使用

    若函数的存储类型为extern型,则为外部函数,他表示该函数能被其他源文件调用。

    函数默认存储类型:extern

    结构体:

    1,在程序中使用结构体,必须对结构体的组成进行描述,这个描述过程为结构体类型定义。

    形式:   struct   person

          {

            long no;

            char name[12];

          };

    在上面的例子中,struct为关键字,person为结构体名,no,name为成员。

    注意:与其他变量不同,定义结构体类型,并不意味着系统将分配一段内存单元来存放各个数据成员,这只是定义类型而不是结构体变量。他告诉系统该结构有哪些成员构成,并把它们当做一个整体来处理。

    2.结构体变量定义:一旦定义了结构体,就可以定义结构体变量,可以采用不同方式定义结构体变量。

    A-  struct  person   stu,worker;

    上面定义了两个结构体变量(stu,worker),它们是结构体 struct person(此如同int一样,代表类型名) 的变量。

    B-

     struct   person

          {

            long no;

            char name[12];

          }teacher,doctor;

    上面定义了两个结构体变量(teacher,doctor)。

    C-

         struct   

          {

            long no;

            char name[12];

          }teacher,doctor;

    上面只是定义了teacher和doctor两个变量为结构体类型,但没有定义该结构体类型的名字,所以不能再用来定义其他变量,struct stu 是不合法的。

    3,结构体变量初始化:

    struct   person

          {

            long no;

            char name[12];

          };

    ***********************************************************************************

    A:  struct person teacher  ={"4300","LI MING"};

    B: 

    struct   person

          {

            long no;

            char name[12];

          } teacher  ={"4300","LI MING"};

    注意:不能直接对结构体变量赋予一组常量:teacher  ={"4300","LI MING"};

    4,结构体变量引用:

         struct   

          {

            long no;

            char name[12];

          }teacher,doctor,*w;(指针w指向结构体变量doctor)

    A:doctor.no  B:(*w).no  C:doctor->no     是对结构体变量doctor的no成员的正确引用。

    结构体还可以嵌套,举例说明:

    #include<stdio.h> 
    
    main()
    {
    typedef struct
    {
    
    int cf;          
    
    } lv_img_header_t;
    
    typedef struct
    {
      lv_img_header_t header;
      int data_size;
      const int *data;
    } lv_img_dsc_t;
    
    int as[3]={1,2,3};
    
    const lv_img_dsc_t xx = {
      .data_size = 2500,
      .header.cf = 1,
      .data =as,
    };
    
    
    printf("sss%d\n",*xx.data);
    return (0);    
    }

    补充:

    指针变量的定义:[存储类型]   数据类型   *指针变量名[=初值];

    指针变量使用:

    赋值:(1) int i,*p;

          p=&i;

        (2) int i,*p=&i;

    将指针p指向变量i的地址。

    引用:

    (1)*p-------代表所指变量的值

    (2)p--------代表所指变量的地址

    数组定义时,数组名字也是数组的首地址

    typedef:类型别名

    typedef用于为现有的类型创建一个新的名字,或称为类型别名。这样可以简化变量的定义,一般用在结构体上。

    例如:

                typedef    struct   

          {

            long no;

            char name[12];

          }GPIO_TYPEDEF;

      typedef 为结构体定义了一个别名叫GPIO_TYPEDEF,这样就可以通过GPIO_TYPEDEF来定义结构体了。

    例如;GPIO_TYPEDEF    teacher,doctor;

    这里GPIO_TYPEDEF与struct   person是等同的作用。

  • 相关阅读:
    Django 数据导入和导出(数据库的迁移方法)
    【转】JSON Web Token 入门教程
    【转】详解drf中的ModelViewSet
    【转】Django 多数据库联用
    【转】django.contrib.auth之authenticate函数源码分析
    【转】Django-rest-framework
    django 自带用户认证系统 以及 自定义用户认证系统
    DRF 中接口设计,接口参数校验问题总结
    my read wood / zelkova / elm
    db CouchDB 2.1.2
  • 原文地址:https://www.cnblogs.com/caiya/p/9273183.html
Copyright © 2020-2023  润新知