linux C读书笔记

来源:互联网 发布:软件项目进展汇报 编辑:程序博客网 时间:2024/05/23 16:56
完成最近的学习任务,把《linux C程序设计 王者归来》吴岳编著这本书自己不懂的和一些底层的知识点记录下来,好记性不如烂笔头,加油加油!

基础知识记录

    活用短路计算是一种高级的C语言程序设计技巧。

    对于乘法来讲,所有的乘法操作均可以由左移运算来替换,除法操作只有当是2的n次幂时才能使用右移操作替换除法运算。

    减少内存访问:x = x+1;替换为x=+1;

    栈的生长方向:高地址->低地址

    C语言的符号解析规则: 不允许有多个符号的定义,这里的符号指的是变量或者函数;如果有一个符号定义和多个符号的声明,则选择被定义的符号;如果有多个符号的声明,则从其中任选一个作为符号的定义。

    int (*p)[5];表示p是一个指针,指向一个具有5个整形元素的数组。因此p+1表示p移动的字节数等于p所指向的数组对象的字节数。

    void*指针表示一个任意类型的指针,其可以指向任意一个类型的的内存单元。

关于函数调用理解

    一个函数调用主要步骤:1,将参数压入堆栈,保存寄存器的值,保存返回地址,跳转。


全局变量和局部变量

    全局变量的生命周期是整个程序,而局部变量的生命周期仅在函数调用未结束之前有效;

    局部变量存储在栈上,而全局变量存储在数据段上。

    局部变量存储在内存的堆栈中,定义了局部变量后,编译器不会将其初始化为0,而是使用其占用的内存空间原有的随机值。

    全局变量默认值为0。而对于没有明确赋值的全局变量,编译器将其分配到.bss(未初始化)段

extern、static和const修饰

    extern用来扩展全局变量的作用域,扩展的范围从使用extern变量出现到该文件结束。只是让其他文件的程序可以应用该变量并不改变该变量的生命周期。

    static静态变量用于限制作用域,这种变量存储在数据段上。静态全局变量作用域仅限该文件,实现一个模块的封装,而静态局部变量该变量生命期。

    const修饰符:左数右指

const      int* p: p是一个指针变量,指向一个整型变量的存储空间。(指针p可以改变,而指针所指向的内容不可改变)

int* const p=&a; p是一个指针变量,指向一个整型变量的存储空间。(指针p是不可以改变的,而指针所指向的内容可以改变)

int const * const p;指针和指针所指向的内容都不能改变

    指向const变量(存储在只读数据段)的指针或者const变量的地址,不可以传给指向非const的指针,以免通过后者意外修改了const存储区的内容。

    因此,合理使用关键字const可以使编译器自然地保护那些不希望被改变的变量,防止意外修改。

incline和restrict修饰

    incline关键字可以使程序的执行效率跟高,同时使代码更加紧凑。restrict关键字用于使编译器放心进行优化。


进程环境部分

    简单变量如int,float等存储在数据段里,便于程序快速读取,提高效率。

    字符串常量是一个复杂变量,存储在一个只读的数据段里,任何修改都不被允许。

    程序加载的简单过程。

  1. 从目标文件读取足够的头部信息,找出需要多少地址空间。
  2. 分配地址空间,如果目标代码的格式具有独立的段,那么就将地址空间按独立的段划分。
  3. 将程序读入地址空间的段中。
  4. 将程序末尾的bss段空间填充为0,如果虚拟内存系统不这么做时。
  5. 如果体系结构需要,创建一个堆栈段。
  6. 设置诸如程序参数和环境变量的其他运行时的信息
  7. 开始运行程序,从main函数的地址开始顺序执行程序。

    Linux内存存储:大端法,小端法。数据最低位存储在内存的低地址处,这种存储方法交做小端法。

    函数的代码存储在代码段中。初始化数据段(.data)包含程序总明确给定初始值的全局变量和静态变量。初始化数据段在编译的时候确定该段的大小,在程序运行过程中该段的大小不能发生改变。

    非初始化数据段(.bss)存储在这个数据段的数据通常是没有明确给定初值的全局变量和静态变量(自动分配为初值为0或者NULL)

    对于小端法的处理器,其栈由高地址想低地址缩减,堆由低地址向高地址增长。


高级进阶

    Vi,gcc,gdb的使用;静态库,动态库的区别及使用;Makefile文件的编写

    Shell环境,理解环境变量表,查看内置的全局变量,使用errno调试程序。

    局部跳转和全局跳转的学习。

    时间和日历历程,进程操作和进程间的通信,线程的操作和线程同步

    文件I/O操作:Unix文件操作和库函数文件操作;目录相关操作。

    TCP和UDP协议及对应的网络编程应用程序。

    Shell脚本入门学习。

原创粉丝点击