C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录和整理些 ,我认为比较重要的知识进行分享. 知识 一:声明,定义与初始化 1.关于int与long,众所周知,C语言标准没有规定标准类型的大小,特别是对于int类型,在甚多16位的机器上看,int类型其实是16位的,而到了32位机器上,int就是32位的了,实际上,int类型代表了机器的自然字长,这是多整形变…
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题.书中列出了C用户经常问的400多个经典问题,涵盖了初始化.数组.指针.字符串.内存分配.库函数.C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点. 编辑推荐 <你必须知道的495个C语言问题>结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,…
1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文件里,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定.也就是说extern有两个作用: 第 一,当它与"C"一起连用时,如: extern "C" void fu…
本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限度的发挥它的优势,而发挥C语言优势的正是指针 造物者的错 ; int*p =&i; *p =; 以上简单的代码,很不幸的混乱了指针与指针的解引用,但是 ,这是最正宗的C语言语法,我初学C指针的时候,经常把* 当作指针的代名词,所以很当然的把*出现的地方当作 指针,所以我分不清上面代码的差异,所以我可…
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住以下观点:i++是先使用i的值,再对i进行+1操作,而后者则刚好相反,先将i+1,再使用i的值.一直都是这么记得,笔试也没错过,也就信了老师了.更合理的解释是:++i在存储的值上增加1 并向使用它的表达式"返回"新的.增加后的值,而i++对i增加1,但返回的是原来的.未增加的i的值. 但是…
这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: struct student { char * name; int number; }; 在前文中,我们介绍了typedef 的用法,这里,我们可以使用该关键词声明一个学生结构体变量 typedef struct student stu_st; 在使用该结构体的地方都可以使用stu_st 代替: str…
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit    4byte char 8bit   1byte   short    16bit 2byte long 32bit 4byte float 32bit   4byte double 64bit    8bit 注:wchar_t在Windows中是2byte,在Linux中是4byte 1.2为什么不精确定义标准类型的大小?…
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "abc";合法吗? A:它在ANSI C标准中是合法的,它声明了一个长度为3的数组,把它的3个字符初始化为'a', 'b'和'c',但没有终止符'\0',因此该数组并不是一个真正的C字符串,从而不能用在strcpy, printf %s等语句中. 3. Q:memcpy()和memmove()有什么区…
一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")."!"实际上包含两个字符:'!'和'\0'. 2. Q:为什么不能这样检查一个字符串是否跟某个值匹配? char *string; ... if (string == "value") { /* string matches "value"*/ } A:C语言中…
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C语言总是按值传参,你可以模拟按引用传参,定义接受指针的函数,然后在调用时使用&操作符.但C没有任何真正等同于按引用传参的东西. 3. Q:怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量,或者相反? A:C标准中规定整数与指针之间的相互转换是实现定义的,因此不保证指针和整数之间无需修改就能相…