摘要:以Windows操作系统为例介绍安装过程:安装ctags应用程序。到CTags的官方网站下载最新版本,解压后将ctags.exe文件放到系统的搜索路径中。安装Sublime Text 2的Package Control功能。打开Sublime Text 2,使用快捷键ctrl+`呼出命令行,执行如下...
阅读全文
随笔分类 - C/C++
摘要:以Windows操作系统为例介绍安装过程:安装ctags应用程序。到CTags的官方网站下载最新版本,解压后将ctags.exe文件放到系统的搜索路径中。安装Sublime Text 2的Package Control功能。打开Sublime Text 2,使用快捷键ctrl+`呼出命令行,执行如下...
阅读全文
摘要:这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器。 下面我们以一个实例来说明如何使用gcc...
阅读全文
摘要:Valgrind简介: Valgrind是动态分析工具的框架。有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序。你也可以利用Valgrind框架来实现自己的工具。 Valgrind通常包括6个工具:一个内存错误侦测工具,两个线程错误侦测工...
阅读全文
摘要:#include #define MAXLINE 20int main(void){char line[MAXLINE];while(fgets(line,MAXLINE,stdin) != NULL && line[0] != '\n') fputs(line, stdout);return 0;...
阅读全文
摘要:一、在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y);首先它是一个函数,只不过这个函数的...
阅读全文
摘要:#include #include size_t mstrlen(const char *s){ assert(s != NULL); if (s == NULL) { return 0; } size_t ret = 0; while (*s != '\0') { ++ret; ++s; } return ret;}void test_strlen(){ char a[] = "hello,world"; printf("%lu\n", mstrlen(a));}char *mstrcpy(char *dst, const char *
阅读全文
摘要:冒泡排序:void bubble_sort(int *a, int n){ int i, j; for(i = 0; i a[j + 1]){ a[j] = a[j] + a[j + 1]; a[j + 1] = a[j] - a[j + 1]; a[j] = a[j] - a[j - 1]; } }}选择:void select_sort(int *a, int n){ int start, next, min, swap; for(start = 0; start temp){ for(k = i; k < j;...
阅读全文
摘要:一、预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 ―常量字符串就是放在
阅读全文
摘要:数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]所以数组指针也称指向一维数组的指针,亦称行指针。指针数组 定义 in
阅读全文
摘要:(1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 (2)register 这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中...
阅读全文
摘要:多线程通信的方法主要有以下三种:1.全局变量进程中的线程间内存共享,这是比较常用的通信方式和交互方式。注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。2.Message消息机制常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。2.1.PostMessage()函数原型: B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);参数
阅读全文
摘要:目录1简介2代码示例3从系统时钟获取时间方式4time函数介绍函数名称: localtime函数名称: asctime函数名称: ctime函数名称: difftime函数名称: gmtime函数名称: time函数名称: tzset1简介time.h是C/C++中的日期和时间头文件。2代码示例# include #include int main(void){time_t timer =time(NULL);printf("ctime is %s\n",ctime(&timer)); //得到日历时间return 0;}3从系统时钟获取时间方式time_ttime
阅读全文
摘要:一、位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 ...
阅读全文
摘要:前段时间准备面试,看了一些库函数的实现,在看到memcpy时,发现有处理source和destination所指内存有重叠的情况,而strcpy没有,特别模仿库函数写了这个函数,并进行了测试.以下是具体的source code 和测试结果.char *strcpy2(char *strDest, const char *strSrc){assert((strDest!=NULL) &&( strSrc!=NULL));if ( strDest == strSrc)return strDest ;char *tempptr = strDest ;while( (*strDest+
阅读全文
摘要:写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧./******************************分割线如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时........
阅读全文
摘要:内联函数的执行过程与带参数宏定义很相似,但参数的处理不同。带参数的宏定义并不对参数进行运算,而是直接替换;内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数。 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定;而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患。 使用内联函数时,应注意以下问题: 1)内联函数的定义性声明应该出现在对该函数的第一次调用之前。 2)内联函数首先是函数,函数的很多性质都适用于内联函数,如内联函数可以重
阅读全文
摘要:编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟。 编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数的类 中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函数调 用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数调用插入代码,所有这些都是自动发.
阅读全文
摘要:一、拷贝构造函数使用原则:当对象中含有类型为指针的成员变量时,重载拷贝构造函数能够防止两对象共享同一成员指针的问题。classTest{public:Test(void);// 默认构造函数Test(constTest& t);// 拷贝构造函数~Test(void);// 析构函数private:char* name;// 指针成员变量};Test::Test(void){ name = NULL;}Test::~Test(void){delete[] name; name = NULL;}Test::Test(constTest& t)// :Parent(t) // 如果
阅读全文
|