
C/C++
chenyufei1013
探索计算机背后的奥秘,研究计算机背后的原理,让计算机为我做更多的事。
展开
-
虚函数的研究
我们知道C++程序编译好以后大致分为:代码区、数据区,比如说类的函数体就被放在代码区,每一个类的实例则被放在数据区。假设有下面的类的结构:#include class Base {public: void foo() { printf("Base::foo()./n"); }};class Derive :原创 2008-12-14 14:47:00 · 666 阅读 · 0 评论 -
C语言知识结构之二
C语言的知识结构整理成思维导图,如下图所示:这张图的整体思路是:用C写程序,该学会什么?要用C写的更好,改学会什么?其实,只要是分层的知识结构,大致的思路是:首先,研究本层的知识;其次,研究上面第一层、下面第一层的知识;(若存在的话)第三,研究上面、下面加一层的知识;重复步骤3。目标只有一个:把本层的工作做好(牢记目标,别发散了,研究其它层过于深入)。举两个例子:用C写出来的代码,原创 2015-08-23 00:44:14 · 2672 阅读 · 0 评论 -
C语言的string.h库笔记
最近在研究C语言,C语言本身的语法规则,加上它的C89,C99等标准,还是挺复杂的。除了C语言本身外,它的库函数也是必要的组成部分,本文先简单的分析一下string.h中的函数,参考了C99标准。有些函数(比如strtok)我很少用到,后面用到了再填充吧。1. memcpy:将源buffer内容的开始n个字节复制到目标buffer中,不检查buffer重叠。 2. memmove:和mem原创 2011-01-06 19:36:00 · 2819 阅读 · 0 评论 -
重读C++之一:封装、继承和多态
导读 前段时间重新看了一下C++,一是感觉清晰了许多,二是觉得若是换个角度看的话,会有不一样的体会,并且也容易记住C++中的一些特性。本文就试图将集合论中的相关知识引入到C++的封装、继承、多态上,让我们对它有个重新的认识。 从代码的角度而言,我认为计算机语言都不可不免的解决以下两个问题: 1.为了构建大型的程序,需要将代码模块化。C+原创 2011-12-01 20:31:05 · 9201 阅读 · 2 评论 -
Unix环境高级编程习题3.2
题目 3.2 Write your own dup2 function that performs the same service as the dup2 function described in Section 3.12, without callin原创 2011-09-23 08:57:26 · 2382 阅读 · 3 评论 -
Linux semaphore POSIX信号灯的Hello World
信号灯(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语(引自Unix网络编程第2卷进程间通信第二版)。闲话少说,直接上Hello World代码。其中用到的信号灯函数的用法参见进程间通信一书第10章。本人的测试环境cygwin。服务端原创 2011-09-21 20:20:16 · 1257 阅读 · 1 评论 -
判断指针是否为空
这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设p为指针): if (NULL == p) { // ... } if (!p) { } 到底哪种方式好呢?这个问题应该从两个方面去考虑,本文就是围绕这两个问题展开的,仅限于C语言。 它们在语义、编译等环节上是否等价? 它们在可读性、可维护性等上面是否等价?一、是否存在隐式类型转换?《C 程序设计语言原创 2011-02-18 14:24:00 · 52779 阅读 · 5 评论 -
C语言写游戏之一:试着写一个游戏引擎
研究C语言最好的办法就是去实践它,而实践的最好方式就是写一些比较大一点的程序,这里说的比较大个人觉得怎么的也得一万行吧。否则,还没过瘾呢,就写完了,哈。 在这个目的的驱动下,本人上周业余时间花了一周多的时间用C语言写了一个游戏引擎BWF(Buffered Window Framework)。这个引擎利用了窗口相关的WinAPI和Cairo(http://cairographics.org/documentation/)开源图形库来完成的。写完后,下了个小工具(http://www.原创 2011-01-26 23:25:00 · 20197 阅读 · 2 评论 -
C 语言 stdlib.h 库 笔记
stdlib.h也是比较常用的一个头文件,它其中包含的一些函数还是很方便的。原来malloc函数就包含在其中,一直没有发现。 1. atof:将字符串转换成double数字。 2. atoi, atol, and atoll : 将字符串转换成整型。 3. strtod, strtof, and strtold:将字符串转换成浮点数。 4. strtol, strtoll, strtoul, and strtoull: 将字符串转换成整数。 5. rand and sra原创 2011-01-10 16:52:00 · 1529 阅读 · 0 评论 -
C 标准 头文件 总结
在C99标准中,关于C语言标准库的描述还是占很大的一部分的。这也难怪,C语言除了语言语法之外,其另外一个核心就是它的库了。通过对库的头文件的总结,我们发现它的目的是让编写基于操作系统的C应用。而一些语言层面的操作,比如:字符串的处理,则可以将C程序用在操作系统内部。感觉,有了C语言的库,则可以做出了图形显示以外的任何事。下面将列出这些头文件: 1. assert.h, errno.h, setjmp.h : 断言、错误值和异常,程序调试用。 2. complex.h, math.h, tg原创 2011-01-11 08:44:00 · 1013 阅读 · 0 评论 -
C 语言 assert.h 库 笔记
assert.h中,就只定义了一个用来调试的宏assert。 1. NDEBUG宏,用来表示是否是DEBUG状态,当该宏定义时,assert的宏被定义为: #define assert(ignore) ((void)0) ((void)0)是空语句,不会产生任何代码。写成这种形式的原因是,比如一个(assert(0原创 2011-01-07 10:00:00 · 1123 阅读 · 0 评论 -
C 语言 stdio.h 库 笔记
stdio.h中,除了有输入输入函数之外,还包含了一些用来调试的函数。可以将少我们的工作量,下面是简单的总结: 1. remove: 删除文件。若文件已打开,则remove操作的效果未知。 2. rename: 重命名文件。若已有修改后文件名的文件存在,那该函数的效果依赖于具体的实现。 3. tmpfile: 创建临时文件。当程序退出时,该文件所占的资源自动删除。若程序意外退出,临时文件是否删除依赖于具体的实现。 4. tmpnam: 自动生成一个有效的文件名,该文件名对原创 2011-01-06 21:23:00 · 1260 阅读 · 0 评论 -
C语言的变参的研究
最近,老遇到C语言中使用变参的问题,一直不明白怎么回事,就稍许研究了一下,感觉挺有收获的,于是就有了本文。 函数的变参实际上就是:C语言利用调用栈而提供的一种参数传递的机制。 一、调用栈 我们知道C语言的调用约定为__cdecl,它的特点为:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。要了解它的确切含义,就先看一下函数调用是发生了什么,假设有如下的程序: 1: #include 2: #include原创 2010-12-22 20:36:00 · 1004 阅读 · 0 评论 -
win7上的c和asm互调用
最近在研究操作系统,《自己动手写操作系统》上第5章讲了asm和c函数之间互调用,目的是使用c来写操作系统内核的代码,毕竟用汇编写代码还是很费时间的事。 配置Linux开发环境实在是太麻烦,要装虚拟机,还要配置老半天。于是就想能都在windows环境下实现互调用,很自然的想到了mingw交叉环境。于是下了一个win32版本的nasm编译器,用nasm编译汇编,用gcc编译c,查了一下n原创 2010-04-20 20:18:00 · 3502 阅读 · 0 评论 -
利用cl, link, make创建C++开发环境
工具cl:VS下的C++编译器link:VS下的C++链接器make:Linux下的自动化编译工具,定义了文件之间的依赖关系,与具体的编译、链接器无关,该工具可以从Cygwin安装目录中获取。HelloWorld本节假设以安装了VS开发环境,并在命令行内作了环境变量设置。1)HelloWorld是一切的开始,首先创建Hello目录,及main.cpp文件,内容如下:原创 2010-04-13 13:17:00 · 3016 阅读 · 0 评论 -
cl编译控制台可调式的程序
元旦要调到新的组,开始系统的学习C++,首选的书籍是《C++ Primer》。系统的学习有个好处就是很系统,尤其是当自己写过一段时间的代码之后帮助尤为明显。安装了VS2008后,就可以在控制台下面编译自己的代码了首先执行文件:C:/Program Files/Microsoft Visual Studio 9.0/VC/vcvarsall.bat 再执行如下命令,main.cpp是要编原创 2009-11-08 15:21:00 · 1034 阅读 · 0 评论 -
虚函数的研究(一)
C++里有虚函数的概念,用法也很简单,在函数声明之前加关键字virtual。之所以有这样的概念的原因,是为了面向对象的程序能“向后兼容”,通过它你可以事先写好程序框架,后面再慢慢实现,而不用改原来的款价。看个例子: #include class Base {public: virtual void foo() { printf("vir原创 2008-12-15 21:03:00 · 826 阅读 · 0 评论 -
C语言知识结构
很长时间以来,都是在用C语言写东西。也一直在思考,如何能很好的掌握C,查过很多资料,也作过一些尝试,于是整理成此文。在大部分情况下,我们会写或者使用一个C库,然后被应用程序使用,运行在Linux的系统上。于是,就有了基于C语言的知识结构: App------------------- C API C, libc------------------- Posix AP原创 2015-05-31 22:48:15 · 2877 阅读 · 0 评论