《你必须知道的495个C语言问题》知识笔记及补充
1. extern在函数声明中是什么意思?
它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里。但在
extern int f(); 和 int f(); 之间并没有实质的差别。
补充:extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文件里,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说extern有两个作用:
第 一,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译对应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的。这要看编译器的"脾气"了(不同的编译器採用的方法不一样),为什么这么做呢,由于 C++支持函数的重载。
第二。当extern不与"C"在一起修饰变量 或函数时,如在头文件里: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的keyword,其声明的函数和变量能够在本模块活其他模块中使用,记住它是一个声明不是定义!也就是 说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它仅仅要包括A模块的头文件就可以,在编译阶段。模块B虽然找不到该函数或变量, 但它不会报错。它会在连接时从模块A生成的目标代码中找到此函数。
2. 如何建立和理解非常复杂的声明?比如定义一个包括N个指向返回指向字符的指针的函数的指针的数组?
这个问题至少有以下3种答案:
(1)char *(*(*a[N])())();
(2)用typedef逐步完毕声明:
typedef char *pc; /* 字符指针 */
typedef pc fpc(); /* 返回字符指针的函数 */
typedef fpc *pfpc; /* 上面函数的指针 */
typedef pfpc fpfpc(); /* 返回函数指针的函数 */
typedef fpfpc *pfpfpc; /* 上面函数的指针 */
pfpfpc a[N]; /* 上面指针的数组 */
(3)使用cdecl程序,它能够把英文翻译成C或者把C翻译成英文:
通过类型转换。cdecl也能够用于解释复杂的声明,指出參数应该进入哪一对括号(如同在上述的复杂函数定义中)。
补充:cdecl程序非常实用,它能够在C语言的声明和英语之间进行转换。
它能够解释一个现存的C语言声明,cdecl 程序能够帮助你分析复杂的声明。
3. 为什么struct x { ... }; x thestruct; 不正确?
C不是C++。
结构标签不能自己主动生成类型。
补充:也就是在C++中这样是对的。
在C中不想用struct仅仅能借助于typedef。
4. NULL能够确保是0。但空指针(null)却不一定。
5. 数组和指针的差别是什么?
可是。要小心sizeof。
6. 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。
假设你向函数传递二维数组:
7. 为什么这段代码不行?
char *str;
gets(str);
printf("%s\n", str);
改正方法:用局部变量或用malloc()分配str缓冲区。
8. 我刚才试了这种代码char *p; strcpy(p, "abc"); 而它执行正常?怎么回事?为什么它没有崩溃?
但你还没有分配不论什么让指针指向的内存,因此此时p所指向的内存可能是垃圾信息也可能是可写的区域。没有崩溃说明是后者。
9. 以下关于itoa的实现为什么是错误的?如何改正?
char *itoa(int n)
{
char retbuf[20]; // error
sprintf(retbuf, "%d", n);
return retbuf; // error
}
一种解决方式是把返回缓冲区声明为静态变量:
总结:若要返回字符串或其他集合,则返回指针必须是静态分配的缓冲区。或者调用者传入的缓冲区。或者用malloc()获得的内存。但不能是局部(自己主动)数组。
10. 为什么在调用free()之后指针没有变空?使用(赋值,比較)释放之后的指针有多么不安全?
补充:free()过后的指针也叫做“野指针”,建议free()过后马上将指针置为NULL,具体原因请看“为什么free(re)过后re不为NULL呢?”。
11. calloc()和malloc()有什么差别?利用calloc的零填充功能安全吗?free()能够释放calloc()分配的内存吗,还是须要一个cfree()?
p = malloc(m * n);
memset(p, 0, m * n);
12. 在C中,sizeof('a')=4而不是1。由于C语言中的字符常数是int型,因此sizeof('a')是sizeof(int),这是与C++不同的地方。
13. C语言中没有提高标准的布尔类型,须要用#define或枚举常数定义true/false。
14. 我试图用ANSI“字符串化”预处理操作符#向信息中插入符号常量的值。但它字符串化的总是宏的名字而不是它的值。
#define Str(x) #x
#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);
15. memcpy()和memmove()有什么差别?
而memcpy()则不能提供这种保证,因此能够实现的更加有效率。
假设有疑问,最好使用memmvoe()。
16. 我如何在printf的格式串中输出一个'%'?我试过"\%"。可是不行。
\%不行,由于\是编译器的转义字符,而这里我们的问题终于是printf的转义字符。
17. 为什么大家都说不要使用gets()?
标准库的fgets()函数对gets()作了非常大的改进,虽然它仍不完好。假设真的可能输入非常长的行,还是须要细致思考,正确处理。
18. 一个粗陋但通常有效的測试NaN的方法:
#define isnan(x) ((x) != (x))
19. 如何推断机器的字节顺序是高字节在前还是低字节在前?
int x = 1;
if(*(char *)&x == 1)
printf("little-endian\n");
else
printf("big-endian\n");
20. 由一个日期,如何知道是星期几?
int dayofweek(int y, int m, int d) /* 0 = Sunday */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m - 1] + d) % 7;
}
《你必须知道的495个C语言问题》知识笔记及补充的更多相关文章
- 你必须知道的495个c语言问题(笔记)
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit 4byte char 8b ...
- 你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...
- C语言学习书籍推荐《你必须知道的495个C语言问题》
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...
- 你必须知道的495个C语言问题,学习体会四
本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...
- 你必须知道的495个C语言问题,学习体会三
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...
- 你必须知道的495个C语言问题,学习体会二
这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...
- 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器
一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
随机推荐
- PHP性能优化学习笔记--语言级性能优化--来自慕课网Pangee http://www.imooc.com/learn/205
使用ab进行压力测试 ab -n行数 -c并发数 url 重点关注下面两点: 1.Request per secend : 每秒可接收的请求数 2.Time per request : 每次请求所耗费 ...
- SSO之CAS基础及应用视频教程(2)
CAS介绍 CAS = Central Authentication Service,中央认证服务.CAS 是 Yale 大学发起的一个开源项目,能够为 Web 应用系统或者非Web应用系统提供一种可 ...
- phonegap环境配置与基本操作
一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...
- 状态模式----C++实现
状态模式 定义: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 实用性: 1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2. 一个操作中含 ...
- git的使用与积累
之前对git可以说是一无所知,不过现在做工程要用到,于是就花点时间找了一些资料,本文也只是各种git学习资料的集合,权当是学习笔记吧 一:git的安装与配置 首先,git其实一般在linux环境下都是 ...
- (原)编译caffe时提示未定义的引用(undefined reference to)
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5864715.html 参考网址: https://github.com/BVLC/caffe/issu ...
- Fedora19/18/17安装显卡驱动和无限网卡驱动
一.安装nvidia显卡驱动 1. 切换到root用户 su - 2. 确定当前Linux内核及SELinux policy 是否为最新 yum update ke ...
- 序列化layer创建的弹出表单并ajax提交
/** *createTime:2015-09-13 *updateTime:2015-09-13 *author:刘俊 *phone:13469119119 *QQ:418873053 **/ va ...
- Retrieving the COM class factory for component with CLSID XX failed due to the following error: 80070005 拒绝访问。
环境及异常信息说明 环境说明: Win2008 R2 企业版 x64 .IIS 7.0 功能说明:服务端操作Excel,(上传Excel到服务器,并在服务器端读取Excel中的数据) 异常信息:Ret ...
- css3的滤镜模糊的效果
最近在做一个css3的滤镜模糊的效果,但是我发现,有些浏览器一点效果都没有,这是浏览器兼容性导致的,怕今后会忘记所以就先写下来,也希望可以帮到需要的小伙伴. 代码如下: div{//设置半透明滤镜效果 ...