C语言常见问题笔记:
    1. 指针的声明
     char * p1, p2;
  p1 是一个指向char类型的指针,而p2是一个char类型变量
  这是由于 * 并不是基本类型的一部分,而是包含被声明标识符的声明符的一部分。 
 
 2. 储存类型
     同一个静态函数或静态变量最好在所有的声明和定义出都包含(static)
  extern 作为一个格式上的提示,表明函数的定义可能出现在另一个源文件中
  关健字auto毫无用处,已经过时了
  
 3. 在一个文件中定义了一个extern数组,但在另一个文件中无法通过sizeof取到这个数
 组的大小。这是由于sizeof是在编译时产生作用,它不能获得在另一个文件中的数组大小
 
 4. 如何在一个文件中获得另一个文件中定义的数组的大小
     1. 在定义数组的文件中声明,定义,并初始化一个变量,保存数组的大小
  2. 使用define为数组定义一个确定的可见的长度
  3. 在数组后面加入一个元素作为哨兵值,(通常为 0,-1,NULL)
  
 5. 实现抽象数据类型时,让用户使用指向没有公开定义(也许还隐藏在类型定义后边)的
 结构类型的指针。客户使用结构指针(及调用输入和返回结构指针的函数)而不知道结构的
 成员是什么。
 
 6. 通常对结构进行传递和返回时,使用结构指针而非结构,这是由于当结构作为函数参数
 传递时,通常会把整个结构都推进栈,需要多少空间就使用多少空间,为了避免这个代价,
 经常使用指针而不是结构。
 
 7. 使用sizeof返回值大于结构的期望值,这可能是由于尾部填充,也可能是内部填充。
 
 8. 空指针不会指向任何地方,它不是任何对象或函数的地址,取地址操作符&永远也不会
 但会空指针。malloc函数调用失败会返回空指针,这是空指针的典型用法,表示未分配或
 尚未指向任何地方的特殊指针值。空指针并不等同于为初始化的指针,未初始化的指针可
 能指向任何地方。每种类型都有一个空指针,而不同类型的空指针的内部表示可能不尽相
 同。
 
 9. 使用未初始化的指针是非法的,因为此时不知道指针指向何处,且未初始化,通常包括
 垃圾信息,所以甚至都不能保证该指针是一个空指针
 int * p;
 scanf("%d", p);
 
 10. 声明一个指针变量时,编译器只分配了足够容纳指针本身的内存,并没有分配任何让
 指针指向的内存。
 
 11. 使用malloc动态分配内存后,如果再使用realloc来改动动态分配的内存大小,则使
 用malloc之后,realloc之前,指向该动态内存的指针的值也需要改变,这是因为realloc
 并不一定能在原地扩大内存区域,如果它必须到内存中其它地方找寻足够大的内存,则它
 会返回一个不同的指针,而原有的指针值就变为不可用的
 int * p, * q;
 p = (int *)malloc(LEN * sizeof(int));
 q = p;
 p = (int *)realloc((void *)p, LEN_MAX * sizeof(int));
 此时q指向的内存可能非法。
 
 12. 在C语言中,sizeof('a')的值不是sizeof(char),这是由于在C语言中,字符常量是int
 型,所以sizeof('a')的值是sizeof(int),这正是C语言与C++的一个不同的地方
  int main(void)
  {
   printf("%d\n", (int)sizeof('a'));  // 输出结果为4
   
   return 0;
  }
 
 13. 作为一般规则
  a.将宏定义,结构 联合 枚举声明,typedef声明,外部函数声明,全局变量声明,放入 .h 的
  文件中。
  b.永远不要把外部函数原型放到 .c文件中。
  c.如果定义或声明为一个源文件私有,则最好留在该文件中,作用域限于单文件的私有函数和
  变量应该声明为static
  d.不能把实际的代码,如函数体,或全局变量定义,即定义和初始化实例放入头文件中。
  e.当用多个文件创建一个项目时,应单独编译每个文件,即使用特定的编译选项,只进行编译,
  然后再将生成的目标文件链接起来。
 
 14. 在C语言中,只有输入例程试图读取并失败之后才能得到EOF,通常C语言只要检查输入例程的返
 回值。
 while (!feof(infp))
 {
     fgets(buf, MAXLINE, infp);
     fputs(buf, outfp);
 }
 这些代码会把文件的最后一行复制两遍,就是上述的原因
 一般来说可以不使用feof,偶尔使用foef或ferror在stdio调用返回EOF或NULL之后判断是文件结束
 条件还是文件读取错误。
 上述代码可改为
 while (fgets(buf, MAXLINE, infp) != NULL)
     puts(buf, outfp);
  
 15. printf实现可变域宽度
 printf("%*d", width, x);
 格式说明符中的星号表示参数列表中的一个int值表示域宽度
 
 16. 作为一个一般性的规则,不能混用scanf和gets或任何其他输入例程的调用,scanf对换行符的
 特殊处理几乎一定会带来问题。要么就用scanf处理所有的输入,要么不用
 int n;
 char str[10];
 scanf("%d", &n);
 gets(str);
 上述代码中的gets读取到的只是一个换行符,甚至程序不会给你输入字符串的机会
 
 17. C语言的函数总是接收参数的副本,因此函数永远不能通过向参数赋值返回任何东西

C语言细节笔记2的更多相关文章

  1. C语言细节笔记1

    /******************************************************************************* ——笔记 1. 函数申明的书写. 可以 ...

  2. C语言细节总结笔记

    C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...

  3. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  4. JavaScript语言精粹笔记

    JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...

  5. C语言细节——献给入门者(三)

    C语言细节——献给入门者(三) >>主题:关于强制类型转换 先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等.当 ...

  6. C语言细节——献给初学者(二)

    C语言细节——献给初学者(二) 主题  循环运用+选择判断 C语言循环有for和while/do...while: 选择判断有:if...else和switch...case 在循环中需要注意搭配br ...

  7. C语言细节——献给入门者(一)

    C语言细节——献给入门者(一) 主题  输入输出需要注意的细节 首先我们要知道大致有scanf(),printf(),getchar(),putchar(),gets(),puts()这几种输入方式. ...

  8. c语言的笔记

    下面把我这半年来记的一些C语言的笔记贴出来. 1  C语言中函数参数传递是按照“值传递”进行的,即单向传递. 2  函数原型:函数类型 函数名(参数类型,参数类型……),可以不必加参数名,因为操作系统 ...

  9. C语言盲点笔记1

    寥寥数笔,记录我的C语言盲点笔记,仅仅为以前经历过,亦有误,可交流. 1.int* a和int *a有差别吗? 没有不论什么差别,都表示a是int指针 建议这么写int *a;这样明显一点 理由例如以 ...

随机推荐

  1. In line copy and paste to system clipboard

    On the Wiki Wiki Activity Random page Videos Photos Chat Community portal To do    Contribute  Watch ...

  2. js 简单制作键盘模拟

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...

  3. 洛谷 P2337 【[SCOI2012]喵星人的入侵】

    这几天一直在刷插头Dp,写了几道入门题后,觉得还比较水,直到我发现了这一题.... 题目大意:给你一个n*m的地图,有些是空地,有些是障碍,还有两个是ST,在给你一个L,代表可以放L个炮台,你要在空地 ...

  4. 条款28:避免返回handles指向对象内部的成分(Avoid returning "handles" to objects internals)

    NOTE: 1.避免返回handles(包括references 指针 迭代器)指向对象内部.遵守这个条款可增加分装性,帮助const 成员函数的行为像个const,并将发生“虚吊号码牌”(dangl ...

  5. Python数据可视化库-Matplotlib(一)

    今天我们来学习一下python的数据可视化库,Matplotlib,是一个Python的2D绘图库 通过这个库,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率图,条形图,错误图,散点图等等 废 ...

  6. C语言学习11

    直接插入排序 //直接插入排序 #include <stdio.h> void main() { ], i; int insort(int a[], int n); printf(&quo ...

  7. jquery怎么获得ul中li的个数

  8. LR手动关联参数化问题总结

    所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成截取自服务器所送的.动态的.每次都不一样的数据. 一般情况下,比较聪明的服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一 ...

  9. Git上传的使用步骤

    Git上传的使用步骤 首先 git branch 查看当前的分支是否为本地自己分支 接着 git stash 保存本地自己的保存 git checkout earemote 查看本地共有开发分支 gi ...

  10. hexo干货系列:(七)hexo安装统计插件

    前言 前面介绍了如何让百度和谷歌收录我们的博客,那如何查看自己的博客每天被多少人访问呢~ 这里我介绍下hexo中如何使用统计插件,每天看到自己的博客访问量越来越高也是一种享受. 正文 开启统计功能 我 ...