Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381441
  • 博文数量: 69
  • 博客积分: 1486
  • 博客等级: 上尉
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 18:38
个人简介

...

文章分类
文章存档

2024年(1)

2021年(2)

2020年(2)

2016年(9)

2015年(34)

2011年(14)

2010年(7)

分类: C/C++

2016-11-12 21:53:00

C语言编程总结

变量
    
变量在任何时候都遵循先定义后使用的原则 对于任何时候任何场景都成立 这个对于理解全局变量、静态变量、局部变量有很好的意义
    
变量使用前必须初始化
    
局部变量的设置不宜过大,否则可能导致栈溢出
    对于无符号数 判断小于0 实不可取


关键字
    union
       长度为联合体中最大的数据类型的长度
   enum
       默认从0开始计数
   char
       在OS中占一个字节 所以强制类型转换也只占一个字节,例如ulong u1=0xfe89; (char)u1=0x89;
       这里操作十六进制,所以是0x89,如果是字符转换成十进制,则结果是ASCI码值
    sizeof
       计算变量占用的字节数 sizeof(int var[10])=40Bytes; 计算字符数组时已然包括后面的'\0'
   extern/static
       一旦被改写,则以被改写的值为此变量的值,可以在函数内定义和全局变量、静态变量同名字的变量,但是先访问的是本函数内部的变量
   switch..case..default
       case中如果没有发现break、exit(1)之类的中断语句 则一直执行到default时退出



数组
    对于二维数组 先行后列相较于先列后行要快很多,并且务必注意边界检查



指针
    初始换指针为NULL,申请内存空间后,检查是否申请成功;
    释放申请的内存后置空指针为NULL
    检查分支流程,在调用return、exit(1)等推出前,务必释放之前申请的内存
   特别提示:指针作为变量,其本身也是具有地址空间的
  • 指针长度计算
         char *p[10][10]; siezoef(p)=100;
         stu *p=NULL;  sizeof(p)=4;  sizeof(*p)=20;
         指针数组:char *p[10];  sizeof(*p)=4;  sizeof(p)=40;
         p:指针变量,保存的是所指变量的地址,长度为4Bytes,
         *p: 所指的是变量的值;数组作为函数参数时实际是作为指针来操作的



C语言常见编程提示
  • C语言提供的字符串sprintf/vsprintf/strcpy/strcat/等函数很容易导致内存越界,谨慎操作
  • 数组循环操作时防止越界操作
  • memcpy memcpy拷贝时,先调用memset清空缓冲区,当涉及敏感信息时及时调用memset清0
          memcpy拷贝的是无结构的内存,没有规定指针的长度, 也不在缓冲区末尾强制加'\0',最终可能使用了结尾的垃圾数据

   缓冲下,来看如下的结构体和计算
  1. //结构体一
  2. struct TBytes
  3. {
  4.     char ch;
  5.     int var;
  6.     char ch_01;
  7. };

  8. //结构体二
  9. struct TBytes
  10. {
  11.     char ch;
  12.     char ch_01;
  13.     int var;
  14. };

  1. void g_cal(int *a)
  2. {
  3.    for(....)
  4.    {
  5.        a +=i;
  6.    }
  7.    return;
  8. }

  9. void g_cal(int *a)
  10. {
  11.     int b = 0;
  12.     for(....)
  13.     {
  14.        b +=i;
  15.     }
  16.     a += b;
  17.     return;
  18. }



性能和优化
  • 使用局部变量激励频繁使用且需要计算的值;
  • 减少循环次数,展开循环体,减少函数的调用次数
  • 频繁使用的代码使用高效的算法
  • 边界值检查,检查除数为0的情况
  • 字节序:字节序是大端还是小端取决于CPU而非架构



函数使用
  strlen
   这个函数计算的是字符串的长度,以末尾的 '\0' 为结束标志,判断是否已经到字符串尾,计算的长度不包含结尾的 '\0' 

宏使用
 #pragma pack(1) / #pragma()  默认的是4字节对齐方式




阅读(1270) | 评论(0) | 转发(0) |
0

上一篇:Iptables详解

下一篇:vim配置与正则表达式

给主人留下些什么吧!~~