自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 C中预编译详解

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和

2016-03-15 10:45:22 459 1

转载 strlen与sizeof区别

strlen与sizeof都可以用来计算相关字符指针和字符数组的长度,容易混淆。这里用实际例子对它们加以区分。总的来说:strlen是用来计算字符串的字符个数(不含'\0')的函数;而sizeof是用来计算类型或者变量的存储大小的操作符(而不是函数),因此sizeof的结果是在编译阶段就能确定的。题目:char *p1 = "12345678"; char p2[] = "

2016-01-11 10:15:11 455

转载 指针

指针是C语言中的精华。指针其实就是一个变量,和其他类型的变量一样。在32位机器上,它是一个占用四字节的变量(64位上占八个字节),它与其他变量的不同就在于它的值是一个内存地址,指向内存的另外一个地方。 指针根据其所指向的数据的类型可以分为:1)内建型别的指针,指向的是C语言中的一些内建型别char *pch;int *pi;float *pf;double *pd;

2016-01-11 10:10:00 621

转载 字符串初始化

在代码里,经常会用字符串进行初始化操作。比如:void func(void){    char str1[] = "hello world";    char *str2="hello world";    ...}对于上面2条初始化语句,它们的区别是什么呢?1,首先,"hello world"是一个字符串常量,存放在静态常量区。2,str1是一个字符数

2016-01-08 14:56:39 605

转载 字符串长度

在C/C++中,字符串是以零('\0')结尾的。比如,对于下面的字符串:"hello word"  在最后一个字符'd'后面,还有一个我们肉眼看不见的'\0'字符,作为该字符串的结束符。所以,"Hello word"其在内存中的存储形式为:最后有一个我们看不见的'\0'。明白了字符串的结尾方式,那么如何计算字符串的长度呢?比如:例题1:char str1[]

2016-01-08 14:56:03 3589

转载 宏定义

1,定义一个宏,计算数组的长度#define ARRAYSIZE(a) sizeof(a)/sizeof(a[0])2,定义一个宏,计算结构体中成员的偏移#define offsetof(s,m) (size_t)&(((s *)0)->m) 3,多语句宏:在程序设计中,另外一个很经典的算法就是将两个数进行交换。比如有2个整数:int a = 10;int b

2016-01-08 14:55:30 510

转载 volatile关键字

volatile是C语言中的一个修饰符关键字。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样, 编译器就不会去假设这个变量的值了。当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中; 以后,再取变量值时,就直接从寄存器中取值。 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值, 而不是使用保存在寄存器里的备份或者被优化。

2016-01-08 14:54:53 325

转载 extern关键字

对于关键字extern的用法,有如下几种情况:第一,引入其它文件中定义的全局变量或者函数。比如在a.c文件里定义了一个全局变量和函数:/*file:a.c*/int g_total_number=100;int func(void){    ....}如果想在b.c文件里引用a.c文件里的全局变量与函数(不能有static修饰),那么就可以在b.c里使用exte

2016-01-08 14:54:14 307

转载 溢出问题

在C/C++程序里有一类非常典型的问题,那就是:溢出问题。一般在笔试题里,这类问题会以程序改错或者安全问题出现。现在分别来分析一下常见的数组溢出,整数溢出,缓冲区溢出,栈溢出和指针溢出等。(1)数组溢出在C语言中,数组的元素下标是从0开始计算的,所以,对于n个元素的数组a[n], 遍历它的时候是a[0],a[1],...,a[n-1],如果遍历到a[n],数组就溢出了。 void

2016-01-08 14:53:37 1960

转载 内存泄漏与检测

动态分配的内存在程序结束后而一直未释放,就出现了内存泄漏。一般常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,就说这块内存泄漏了。 接着来分析下

2016-01-08 14:52:57 386

转载 static关键字

关键字static的作用经常被作为面试题考查。本人在面试微软工程院的时候就曾经遇到过这个问题的考查。 那么,static关键字的含义有哪些呢?现在总结如下:1.static修饰变量static可以修饰变量。当static修饰全局变量时,表示该变量的作用域只存在于本文件。其他文件就不能引用。比如:在a.c文件里定义了2个全局变量:static int x = 10;int y

2016-01-08 14:52:18 282

转载 自然对齐

在每年各个公司的笔试题中,有一种典型的问题就是计算sizeof()结构体大小的问题。要掌握好这类问题,需要了解结构体的自然对齐规则。一,基本类型的长度计算要做好sizeof相关的计算,首先得掌握C和C++里的一些基本类型的长度(注意,sizeof计算的值都是以字节(Byte)为单位):sizeof(char)的长度为:1sizeof(short)的长度为:2sizeof

2016-01-08 14:51:42 2628

转载 C/C++语言函数参数传递:传值,传指针,传引用

前面我们介绍了函数的调用约定,明白了函数调用者与被调用者之间传递参数的顺序与如何进行栈恢复的。 实际上,函数调用者如何将参数传递给被调用者也是有讲究的。 总的来说,函数参数传递分为3种情况:传值,传指针和传引用。首先,理解一下实参与形参的概念。int func(int x)//x是形参{    return x*x;}int main(void){    int

2016-01-08 14:50:51 1478

转载 调用约定:cdecl,stdcall,fastcall

函数调用约定(Calling Convention),是一个重要的基础概念,它规定了程序执行过程中函数的调用者(caller)和被调用这(callee)之间如何传递参数以及如何恢复栈平衡之间的约定。在笔者面试微软ATC的过程中即被面官考查。当然笔者当时也很顺利的举出了这些调用规约,只是对C++中的一个调用规约记得不大清楚了。下面就来研究这些函数调用约定。在参数传递中,有两个很重要的问题必须得到

2016-01-08 14:50:08 405

转载 内存逻辑地址到物理地址转化

我们知道,在计算机里,内存分为虚拟内存和物理内存。 数据是存放在物理内存中的,而程序中使用的是虚拟内存并通过虚拟内存地址来访问数据和代码的,那么操作系统是如何 将虚拟内存地址映射成为实际的物理内存的呢?这是我们这篇文章要详细介绍的问题。以X86的32位系统为例。如下图所示,在目前的32位的系统中,系统的内存虚拟地址范围为4GB。 其中低2GB主要为应用程序使用(Ring3级别),而高2GB

2016-01-08 11:42:50 6270

转载 表达式求值计算

在C语言中,表达式由运算符、常量及变量构成。每一个表达式,都有对应的一个值。 该值与表达式中操作符的优先级和结合律有关。表达式求值,也会经常出现在名企求职的笔试试题里。 1.位运算表达式求值位运算表达式求值,需要掌握位运算的定义和整数十进制到二进制之间的转化方法。 (具体请参考:进制转化) 题目:试着计算如下表达式的值(某安全名企面试笔试题目):1)15&240

2016-01-08 11:41:30 473

转载 变量类型,作用域,存储空间,生命周期

一,变量与常量定义在C/C++程序里,参与计算的数据都是通过存放在内存中不同类型的常量或者变量来表示的。常量,就是不同类型中不变的值。比如’A’, 100, 3.1415926,"hello world"等等。可以通过宏来定义一些常量,比如:#define PI 3.1415926上面就用一个常量符号PI来定义了圆周率的值。以后就可以在程序中使用这个PI来计算圆相关的数值。

2016-01-08 11:40:27 1694

转载 浮点数的表示与存储方法

计算机中的数分为整数与实数。对于实数,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。 这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ), 一个基数(Base),一个指数(也叫阶码)(Exponent)以及一个表示正负的符号(Sign)来表达实数。 比如 123.45 用十进制科学计数法可以表达为 1.2345 × 10^2 ,其中 1.2345 为尾数,10 为基数,

2016-01-08 11:39:35 913

转载 整数进制转换(十六进制,十进制,二进制)--表格法

在计算机里,最基本的存储单位为字节(Byte,常说的大B),1个字节包含8位(bit,常说的小b)。计算机的数据就是一个字节一个字节的形式存储在内存中。 内存的大小单位有KB,MB,GB,TB等,它们之间的关系是:1KB = 1024B1MB = 1024*1024B1GB = 1024*1024*1024B1TB = 1024*1024*1024*1024B 计算

2016-01-08 11:37:53 8388

转载 整数的存储

大家知道,整数包括负数,零,和正数。计算机中的整数分为有符号数和无符号数。有符号数的最高位表示符号:即最高位为0,表示正数,最高位为1,表示负数。无符号数表示非负数,整个位数都用来表示整数的值。 如果用N位来表示整数,那么有符号数的范围为:[-2^(N-1),(2^(N-1))-1];无符号数的表示范围为[0,(2^N)-1]。比如,用8位来表示有符号整数数,由于第8位用于表示了符号,因此,整数的

2016-01-08 11:37:03 2622

原创 运算符

1.C语言的操作符共有15个优先级,下表展示了各个操作符及其优先级和结合律: 2.记忆口诀: 记忆不能死记,即使通过死记记住了,那也是短期记忆,长久之后也记不住,因此需要讲究特别的技巧。下表用三句话记住所有运算符的优先级:3.操作符易错处 如果不熟悉各操作符的优先级,很容易出现计算错误。一个常见的错误就是移位操作符(>) 与算术操作符之间的优先级。例如想把一

2016-01-08 11:35:57 246

原创 位运算与应用

一,位运算基础位运算(包括与,或,取反,异或,左移,右移等)是程序设计中的一个重要的领域。尤其是安全和底层开发中,除了指针的频繁使用之外,位运算是另一个非常频繁使用的领域。 因此,在求职面试中,位运算也是每年重点考查的知识点。首先,我们有必要复习一下C语言中位运算的一些基础计算方法。 1,与运算:&与运算的操作符为&。2个数进行与运算时,就是将这2个数的二进制进行与操作

2016-01-08 11:34:26 3242 1

转载 sizeof()计算

在每年各个公司的笔试题中,有一种典型的问题就是计算sizeof()的大小问题。在这里,我们对这类问题做一个全面的归纳总结,包含如何 计算结构体,位域,数组,字符串,指针,C++中的class等所有内容。 大家在以后遇到这类问题,就应该信心十足了。当然,掌握这些计算,也不全是为了应付面试,更多的能加深对C的理解和掌握。能够进一步应用到平时的程序设计与调试中。一,基本类型的长度计算要做

2016-01-08 11:33:04 2907

原创 ts、pes、es

PTI过滤: Header(包头)Payload(数据)Header 一、TS流的组成结构:188个字节,结构如下表 Header包含Sync byte 8bittransporterror indicator1 bit payloadunit s

2015-01-05 17:56:42 591

原创 遥控器按键弹起消息

需求:需要对上下方向键添加按键弹起的消息。在遥控器按键弹起时,发送一个按键弹起的消息。实际开发的应用是要求换台时,一直按着遥控器键,只换信息条跳动,不切台,放开按键即按键弹起后,切换到当前停止的台上;

2014-09-12 11:04:42 692

原创 c语言目录操作总结

===================================================char *getcwd( char *buffer, int maxlen ); (获取当前目录)// 功 能 : 获得当前工作目录. // 头文件 : #include // 返回值 : 成功返回指向buffer的pointer // 失败返回NULL,且设置errno为以下三个值之一: //

2014-03-10 12:19:20 778

原创 教你认识指针(一)

#include using namespace std;#include #include //间接赋值//通过形参改变实参int demo02(int *p/*out*/){ int rv=0; *p=1000; return rv;}int demo01(){ int rv=0; int iNum=0; int *p=NULL; iNum=1; p=&

2014-01-11 00:30:52 461

原创 11单链表排序

//单链表排序#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist(){ pHea

2013-12-31 02:11:49 442

原创 10两链表相交,计算相交点

//两链表相交,计算相交点#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist()

2013-12-31 02:10:54 454

原创 9判断两个单链表是否相交

//单链表交换任意两个元素(不包括表头)#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Lin

2013-12-31 02:10:15 463

原创 8判断单链表是否有环

//单链表交换任意两个元素(不包括表头)#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Lin

2013-12-31 02:09:44 433

原创 7单链表交换任意两个元素(不包括表头)

//单链表交换任意两个元素(不包括表头)#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Lin

2013-12-31 02:09:09 576

原创 6把二级链表展开成一级单链表

//有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表展开称一级单链表#include using namespace std;struct LinkNode{ int nValue; LinkNode *pNext; LinkNode(int Value = 0):nValue(Value),pNext(NULL){}};class Link

2013-12-31 02:08:29 752

原创 5两个不交叉的有序链表的合并

//查找单链表中间元素#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist(){

2013-12-31 02:07:39 576

原创 删除单链表给定节点

//删除单链表给定节点#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist(){

2013-12-31 02:06:45 588

原创 查找单链表中间元素

//查找单链表中间元素#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist(){

2013-12-31 02:05:58 674

原创 查找单链表到时第四个元素

//查找单链表到时第四个元素#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist

2013-12-31 02:05:24 479

原创 单链表逆转

//单链表反转#include using namespace std;struct LinkNode{ LinkNode *pNext; int nValue; LinkNode(int value = 0) { nValue = value; pNext = NULL; }};class Linklist{public: Linklist(){ pHe

2013-12-31 02:04:42 495

原创 归并排序

/*归并排序:(分治算法) 先递归调用MergeSort分裂直至只剩下一个元素,然后调用Merge辅助函数合并两个有序数组。*/#include #include using namespace std;#define N 10void PrintArr(int *pnArr, int nLen){ int i; for (i = 0; i < nLen; i++)

2013-12-31 02:02:58 371

原创 快速排序

/*快速排序:(分治思想: 分、治、合) 不同版本:(效率越来越高) 1)、轴值取中间元素,分割时从序列的左端l,右端r向序列中间扫描。交换逆置元素,直到l、r相交。 2)、轴值取中间元素,分割时从序列的左右两端交替检查空闲位置,将逆置元素移动到空闲位置上, 直到l、r相交,最后将轴值放到空闲位置。 3)、当快速排序的子数组小于某个长度n时,不必继续递归。最后对整个数组进

2013-12-31 02:02:21 579

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除