C语言基础

1、基本数据类型
        布尔型        bool
        整形        short\int\long\unsigned short\unsigned int\unsigned long
        浮点型        float\double\long double
        字符型        char\unsigned char
2、运算符
        算数运算符    +  -  *  /  %  ++  --
        关系运算符    >  >=  <  <=  ==  !=
        逻辑运算符    !  &&  ||
        位运算符    ~  &  |  ^  >>  <<
        特殊运算符    +=  -=  *=  /=  %=  >>=  <<=  &=  ^=  |=
3、控制流
        循环控制    while    do...while...    for
        分支控制    if...else...    switch...case...    goto label... label:
4、数组与指针
        指针:
        int a=10;
        int *p=&a; --->*p等价于*(&a)-->a
        int **q=&p;  
          二级指针解引用一次
                  *q -->*(&p) -->p
          二级指针解引用两次
                **q -->**(&p) -->*p -->a
                char *str="hello";
            char **pstr=&str;
          二级指针解引用一次
                *pstr -->*(&str) -->str
          二级指针解引用两次
                  **pstr -->**(&str) -->*str -->'h'
        数组:
        int a[3];
            a<==>&a[0]
            *a<==>a[0]<==>*(a+0)
        int b[2][3];
            b<==>&b[0]
            *b<==>b[0]<==>&b[0][0]<==>*(b+0)
            *b[0]<==>b[0][0]
            &b----------->类型是int *[2][3]
            &b[0]-------->类型是int *[3]
            &b[0][0]----->类型是int *
        数组指针:
        int (*p)[3];    //指针优先级高,相当于声明了一个指针,这个指针很特别,指向了一个数组
        指针数组:
        int *p[3];    //数组优先级高,声明了一个数组,数组的每一个元素都是指针,相当于声明了多个指针
        函数指针:
        int (*p)(int a);//指向函数的指针变量,本质是一个指针变量,可以通过它来调用函数
        指针函数:
        int *p(int a);    //本质是一个函数,函数返回值类型是int类型的指针,参数是int类型
        函数指针数组:
        int (*p[3])(int a);
        函数指针数组指针:
        int (*(*p)[3])(int a);
const指针:用来定义一个只读变量
        三种用法:
            char const *p = &c;    //不能改c中的内容,p是指向字符型常量的指针
            const char *p = &c;    //不能改c中的内容,p是指向字符型常量的指针
            char *const p = &c;    //不能改p中的内容,即不能改p指向的地址,p是指向字符型变量的常指针
            const char *const p=&c; //不能改c中的内容,也不能改p中的内容,p是指向字符型常量的常指针
static关键字作用
            第一:在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,Static修饰的局部变量存放在全局数据区的静态变量区,初始化的时候自动初始化为0,直到程序运行结束以后才释放
            第二:static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以
            第三:static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用

 volatile关键字
             volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
            表示一个变量也许会被后台程序改变,关键字 volatile 是与 const 绝对对立的。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的。
              作用:  

                 1、并行设备的硬件寄存器,存储器映射的硬件寄存器通常也要加 voliate,因为每次对它的读写都可能有不同意义。
                 2、一个中断服务子程序中会访问到的非自动变量,由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。
                 3、多线程应用中被几个任务共享的变量,当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。
                    如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行,volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。
            一个参数既可以是const还可以是volatile吗?
            答:可以,例如只读的状态寄存器。它是 volatile 因为它可能被意想不到地改变。它是 const 因为 程序不应该试图去修改它。
    5、内存管理
        linux虚拟内存空间(由上到下)
        内核(约1GB)
        栈内存        //用来存储局部变量,大约为8M,超出为“栈溢出”
        堆内存        //自由内存,由用户自定义,无大小限制    堆内存分配API:malloc()\calloc()\realloc()
        数据段        //.bss段用来存放未初始化的静态数据,被初始化为0;.data段存放已经初始化的数据,初始值从文件中复制得来;.rodata用来存放只读数据,即常量
        代码段        //.text段用来存放用户程序代码;.init段存储系统自动添加的初始化代码,包括环境变量等
        大小端:
                大端序:数据的高字节存放在低地址,低字节存放在高地址
                小端序:数据的高字节存放在高地址,低字节存放在低地址

 
    6、组合数据类型
        结构体
        共用体
        枚举
        内存大小计算:
            结构体:32位操作系统
                1.先找最大的数据类型
                          最大数据类型>=4字节     整个结构体按照4字节对齐
                      最大数据类型<4字节      整个结构体按照最大数据类型对齐
                2.当遇到不够4个字节,可能需要合并数据    
                共用体:
                    1.先找最大的数据类型
                          最大数据类型>=4字节     整个联合体按照4字节对齐
                      最大数据类型<4字节      整个联合体按照最大数据类型对齐
                    2.按照最大成员同时满足字节对齐,共用体共用同一片内存
    7、高级议题
        头文件
            #ifndef _HEAD_H_
            #define _HEAD_H_
            #endif
        宏定义(内核宏:小结构体找大结构体)
            #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

            #define container_of(ptr, type, member) ({\
                    const typeof( ((type *)0)->member ) *__mptr = (ptr);\
                    (type *)( (char *)__mptr - offsetof(type,member) );})
        条件编译
        复杂声明
        attribute机制

    局部变量和全局变量的区别:
        1. 作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
        2. 内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
        3. 生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
        4. 使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值