C语言大坑

接下来就开始看看坑

  1. 单引号表示表示整数值

    • 双引号表示字符串首的地址
    • 以0开头的整数默认为八进制
    • 注意使用移位运算加快程序执行速度
    • if(a<b == c<d) //比较a、b、c、d的相对大小关系是否一致
    • a[i] = i[a]
    • C语言的不对称边界
    • errno 外部出错变量,可以检测出错信息
    • break 跳出离他最近的那层循环或switch
    • C 语言不能省略形参,即使不使用
  2. C语言的数据存储空间

    • 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)
    • 局部变量在return之后出栈销毁,不要尝试返回局部指针地址
    • 堆 申请、释放原则 哪儿申请哪儿释放
      记得判断 堆 申请成功与否
  3. 一个程序将操作系统分配给其运行的内存块分为4个区域:
      (1)代码区,存放程序的代码,即程序中的各个函数代码块。
      (2)全局数据区,存放程序的全局数据和静态数据。
      (3)堆区,存放程序的动态数据。
      (4)栈区,存放程序的局部数据,即各个函数中的数据。

  4. 强制类型转换

  • 占用空间大的转化为占用空间小的: 考虑字节序(大小端),所使用的部分可能在不同机器上截然不同
  • 占用空间小的转化为占用空间大的: 考虑内存越界访问
  • 结构体强制转换 : 考虑字节对齐
  1. 字符串
  • 通过索引读取字符串时,一定要判断索引的正确性
  1. 多线程编程
  • 互斥量用来对临界区的互斥进入
  • 条件变量用于线程的阻塞等待
  1. 指针

    1
    2
    3
    4
    5
    int * p = NULL;

    &p 表示p的地址
    p 表示变量p的内容
    *p 表示p指向的存储单元的内容
    • 数字0是唯一能输给指针的数值(相当于NULL)
    • void * :指向任何类型的指针
    • 注意深复制和浅复制的区别

      浅复制

      1
      2
      3
      4
      5
      int *p, *q;
      *p = 58;
      q = p; // q 和 P 指向同一内存单元
      free(q);
      printf("%d\n",p); //异常。p的内存已经被q释放
  2. 动态变量

    在程序运行过程中产生的变量称为动态变量

    • 创建

      1
      2
      3
      int * p; char *q;
      p = new int; // 在内存中创建一个变量,存储所分配的内存地址到p中
      q = new char[19]; // 在内存中创建一个数组,并将数组地址存储到q中
    • 使用

      1
      2
      *p = 28;
      *q = "hello";
    • 销毁

      1
      2
      delete p;
      delete [] q;
  3. 动态数组

    • 创建

      1
      2
      int *p;
      p = new int[10];
    • 使用

      1
      2
      3
      * p = 25;   //25存到第一个存储空间里  = p[0] = 25;
      p ++;
      * p = 35; //35存到第二个存储空间里 = p[1] = 35;