zoukankan      html  css  js  c++  java
  • 【转】嵌入式C语言那点事(一)几个重要关键字

    原文链接:http://blog.csdn.net/pirateleo/article/details/7529776

    一、static

    关键字static,修饰变量时:

    1、限制该变量的作用域:比如静态全局变量,只能在该模块中使用(本c文件中)。

    2、决定该变量的存储位置:修饰为静态的变量,存储在静态数据区(非堆栈内)。(同比,全局变量也都存放在静态数据区中。)

    带初值和不带初值的静态变量:(以TI DSP 54XX为例)

    a.不带初值的静态变量,存储在.bss段中。

    b.带初值的静态变量,存储在.bss段中,但其初值存储在.init中。在DSP Booter完成加载初始化后已经将init段的值赋值到.bss对应变量中。

    关键字static,修饰函数时:限制该函数的作用域,仅能在本模块中使用(本c文件中)。

    结论:static关键字对于使用者而言,最重要的是对变量或函数作用域的限制。

    二、const

    关键字const意味着“不变的”:

    1、什么时候该用:定义一个函数时如果在输入参数前加上const,可以防止该输入变量被改写而引出的错误;函数定义时使用const可以起到函数API自注释作用;

    2、怎么用:

    以下摘录经典面试题中的例子:

    const int a; 
    int const a; 
    const int *a; 
    int * const a; 
    int const * a const; 

    前两个的作用是一样,a是一个常整型数。

    第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

    第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

    最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

    三、volatile

    关键字volatile意味着“易改变的”:

    修饰为volatile的变量,编译器不会对其进行任何优化,每次求值时会到指定地址(物理或映射)去读取。因此适用于“并行设备的硬件寄存器(如:状态寄存器) ;一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) ;多线程应用中被几个任务共享的变量 ”,我个人只用到在IO和中断中,至于多线程的问题有个帖子可供参考。

    http://www.soft-bin.com/html/2010/07/30/concurrent-multithread-code-problem-and-volatile-and-atomic-opration.html

    四、堆与栈(heap and stack)

    1) 堆是由用户维护的。比如我们malloc一段空间,此时开辟的空间便在堆中,调用free时再释放。过于频繁的malloc与free会导致堆中产生碎片(一个空间的地址不连续),影响读写速度。

    2) 栈是由编译器控制的,我们无需干涉。比如我们定义的局部变量或是调用了一个函数。以函数调用为例,此时系统会将现场数据(主要是部分寄存器中的数据,如PC的保存可以在调用结束时程序回归此处继续运行)压入栈内,将寄存器空出迎接被调函数中的一系列计算和控制。被调函数执行完后再进行出栈操作,流程继续。

  • 相关阅读:
    101. Symmetric Tree(js)
    100. Same Tree(js)
    99. Recover Binary Search Tree(js)
    98. Validate Binary Search Tree(js)
    97. Interleaving String(js)
    96. Unique Binary Search Trees(js)
    95. Unique Binary Search Trees II(js)
    94. Binary Tree Inorder Traversal(js)
    93. Restore IP Addresses(js)
    92. Reverse Linked List II(js)
  • 原文地址:https://www.cnblogs.com/codecamel/p/4688099.html
Copyright © 2011-2022 走看看