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. swift详解之九---------------自动引用计数、循环引用

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

  2. 解决浏览器自动填充input

    浏览器输入框自动填充解决办法 emmmmm:今天处理公司后台系统遇到的:登录页面浏览器保存账号密码后:浏览器会自动在其他页面进行填充:解决如下图: 浏览器会默认填充input type值为passwo ...

  3. 微信小程序之裁剪图片成圆形

    前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...

  4. 深入理解typeof操作符

    typeof可以检测数据的类型 typeof返回结果的其实是字符串:可以通过以下测试出来 console.log( typeof(typeof(a))); // string typeof返回的数据类 ...

  5. spring tool suite (sts) 创建springmvc(没有实践)

    摘自:STS(Spring Tool Suite)建立默认的spring mvc项目 老外的原创,网址:http://www.codejava.NET/frameworks/spring/spring ...

  6. 【HDU 6153】A Secret (KMP)

    Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,whi ...

  7. manjaro xfce 18.0 踩坑记录

    manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...

  8. 谷歌浏览器修改CSS和js后同步保存到文件中 (译)

    本文标题:谷歌浏览器修改CSS和js后同步保存到文件中. 文本作者:魔芋铃. 英文原文:http://www.stephensaw.me/google-chrome-devtools-source-m ...

  9. 大数据学习——linux常用命令(二)

    二.目录操作 1 查看目录信息 ls / 查看根目录下的文件信息 ls . 或者 ls ./查看当前目录下的文件信息 ls ../查看根目录下 ls /home/hadoop ls -l . 查看当前 ...

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

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