C,C++与数据结构.doc
《C,C++与数据结构.doc》由会员分享,可在线阅读,更多相关《C,C++与数据结构.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 C/C+、数据结构、算法、STL 工作学习积累1C/C+11.1 重点语法21.2 编程技巧21.3 编程规范21.3.1 代码排版、注释、命名等21.3.2 变量、结构、函数的命名与使用31.3.3 代码效率、测试与维护31.4 程序员面试宝典学习42 数据结构43 STL44 基础算法41 C/C+主要包括C/C+的一些重点语法,编程技巧,编程规范,面试重点考察的知识点。1.1 重点语法结合c/c+ 书籍,将工作中经常设计到又相对容易忽略的语法知识点整理出来,以供不时温故而知新。1.1.1 数据类型、运算符、表达式1 (整型、字符型、实数型、枚举)、(数组、结构、共用体)、指针、空类型。
2、2 常量、变量命名规范,123(10)、0123(8)、0x123(16),数值以补码表示、正数不变、负数按位取反加一。3 char占一个字节,int、uint、shortint、占2-4个字节,long、ulong占4个字节,float占4个字节。有效数字为6-7,double占8个字节、有效数字15-16,所有指针类型(与所指对象无关)均占4个字节。4 int a = 32767、a + 1 为-32768(溢出)达到最大从最小开始,达到最小从最大开始5 注意字符和字符串的区别,字符串在内存存储最后位为0,字符变量和整型变量可互用。6 在一个运算式中(一条语句)系统会自动把低位类型数据转为
3、高位类型数据得到结果为高位类型数据(10*1.3f),表达式运算中存在有符号类型和无符号类型时,系统都会自动转换为无符号类型来处理。7 表达式运算从左至右、赋值运算从右至左。j = i+ 与j = +i的区别printf(%d,+i)与printf(%d,i+)不同体现在语句中,一个是先增再执行语句,另一个是执行语句后再增。8 注意赋值时类型不同导致的溢出、x *= y + 8 时把右边看为一整体。printf(%d,a = b)先 a=b;再输出a。9 a = 3*5,a*4 先求表达式a = 3*5、再求表达式a*4 最后逗号表达式的值为后面的表达式值。1.1.2 顺序、选则、循环语句1
4、continue 语句强制程序转入循环底部、跳过continue语句之后的任何语句、进入下一次循环。break 语句用于在循环正常测试条件符合之前终止循环执行、跳出循环体。return 从函数体中返回并退出函数体。2 if(a=b)0),printf(%5d,c=%f,%o,%lx,%s,%u%,a,b,c,a,b,s,a);scanf(%c %d,&a,&b);3 C语言中 0 为假、非 0 为真,(m=ab)&(n=cd)当(m=ab)为真时才执行(n=cd),(m=ab)|(n=cd)相反。4 max=ab?a:b; printf(%d,ab?a:b);条件表达式先判断ab为真取a继续操
5、作、为假取b进行操作。5 ASCII码中小写字母比大些字母大、a=A+32; 判断是否为大小写 =A、=a。6 注意while 与 do while 的区别、理解for(表达式;表达式;表达式)语句的执行过程。理解switch case default。for(;) ,for(sum=0,i=0;i+)1.1.3 函数、数组与指针1 数组使用前要初始化、二维数组可以当做一组一维数组来处理、注意字符数组与字符串的区别。2 调用函数之前应先声明函数、理解局部变量和全局变量(相对与函数而言)静态变量和外部变量(相对函数间和文件间)。3 静态函数只能在本文件中被引用,理解值参数、数组名参数、指针参数的
6、区别,理解函数的返回值。4 区分变量的指针(地址)和指针变量(保存指针的变量),&(其他变量)和*(指针变量)。5 p指向一个数组的某个元素,则p+1指向数组的下一个元素,即若p指向a0则P+i = &ai,p+合法、a+(错误)。6 理解二维数组和指向指针的指针变量的联系。一般来说、数组都可以通过指针来等价操作。7 指向字符串的指针是把字符串的首地址赋给指针变量: char* ch = fsc;能利用字符指针实现字符串的copy等其他操作。8 理解指向函数的指针(保存函数的入口地址),int max(int a,int b);int (*p)(int,int);p = max; p(a,b)
7、;9 把函数指针(或者函数名即函数的地址)作为函数参数传入可以实现在函数中调用函数的多样化。10 理解返回指针值的函数、指针数组的定义和使用(int* pt4;)、指向指针的指针的用法。1.1.4结构体、共用体、枚举1 结构体是构造数据类型,struct 变量命成员列表变量名列表;使用前要初始化。2 指向结构体的指针保存的是结构体的起始地址,用结构体变量或其指针作为函数参数传入。3 共用体数据类型、union 变量命成员列表变量名列表,指的每时间是这段内存可以存放成员列表中的其中一个成员。4 结构体的内存长度等于各成员长度之和、共用体的内存长度等于最长的成员的长度,共用体每一瞬时只有一个成员其
8、作用,共用体变量地址和各成员地址一样,只能把指向共用体的指针作为函数参数,存入新成员后原来的就失去作用。5 枚举类型 :enum 变量名枚举常量列表枚举变量列表; 枚举限定了变量只能取自枚举常量列表中的一种。6 枚举常量默认从0开始、若定义其中一个、后面的逐个加 如:enum colorred=2,blue=5,green,gray,white;只能在同一枚举变量类型之间进行比较和赋值,可以对整型变量进行枚举类型强制转换。7 typedef 定义新的类型名来代替已有的类型名、typedef char* STR;按照正常的类型定义再在前面加上typedef关键子即可。比如定义函数指针新的类型名:
9、typedef int(*p)(int a); p max,min; 这样max,min都是函数指针。1.1.5 预处理、位运算1 宏名一般用大写,#define . #undef 宏定义不是语句是完全、简单的替换,带参数的宏替换,建议所有的层次都要加括号。宏定义#define 是由预处理完成的,而typedef则是在编译时完成的2 文件包含命令 #include #include的区别,防止重复包含。3 条件编译:#ifdef.#else.#endif ,#ifndef.#else.#endif ,#if.#else.#endif ,减少被编译的时间。#define DEBUG #ifdef
10、 DEBUG printf(x=%d,x); #endif 。4 位运算是指进行二进制位的运算,&(按位与)、|(按位或)、(按位异或) 、(取反)、(右移)。运算量只能是整或字符型、位运算的规制是先把整或字符型数据转换成二进制数再按位运算规制进行操作。5 &(按位与):两个相应的二进位都为1、则该位的结果为1、否则为0。6 |(按位或):两个相应的二进位只要有一个为1、则该位的结果为1、否则为0。7 (按位异或):两个相应的二进位同号则该位结果为(假),异号则为(真),如a 、b交换时用法等。8 (取反):对一个二进制数按位取反。9 (左移):将一个数二进制位全部左移若干位,高位左移后溢出(
11、舍弃)、低位补,如:a = a(右移):将一个数二进制位全部右移若干位,低位右移后溢出(舍弃)、高位补,如:a = a2。11 位运算与赋值运算符结合,如 &= 、右边的都作为一个整体。1.1.6 C+关键字、新增语法1 引用是对象的另一个名字、同一个对象的不同称呼、像人的外号一样。2 extern :1.外部引用、在一个文件中引用在其它文件中定义的变量、比如在文件1中int i;在文件2中,需include文件1,再extern int i;从而使文件1的i能在文件2中使用。2. extern C、在C+环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义从而导致链接失败
12、的情况C+语言在编译的时候为了解决函数的多态、重载问题、会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器用C的方式来编译函数。3 inline:inline定义解决了一些频繁调用的小涵数大量消耗栈空间的问题,避免了频繁调用函数对栈内存重复开辟所带来的消耗。inline只适合涵数体内代码简单的涵数使用、不能包含复杂的结构控制语句。4 const:const 推出的初始目的、是为了取代预编译指令#define、消除它的缺点、继承它的优点。const 是一个左结合的类型修饰符、常用于
13、常量定义,修饰函数传递参数与返回参数等。const int* const x=&d;int const* const x2=&d;5 friend:友元函数,让该函数或类能够访问另一个类的private和protected成员。6 this:this是指向对象本身的指针、作用域是在对象内部、当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。7 static:要理解static,就必须要先理解auto,auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不au
14、to,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。 void func()int a; static int b; 每一次调用该函数,变量a都是新的,因为它是在进入函数体的时候被分配,退出函数体的时候被释放,所以多个线程调用该函数,都会拥有各自独立的变量a,因为它总是要被重新分配的;而变量b不管你是否使用该函数,在程序初始化时就被分配的了,或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),所以多个线程调用该函数的时候,总是访问同一个变量b,这也是在多线程编程中必须注意的! static的全部用法
15、:1 类的静态成员:在cpp中必须对它进行初始化:类的静态成员是该类所有实例的共用成员,也就是在该类的范畴内是个全局变量,也可以理解为是一个名为A:s_value的全局变量,只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的,所以只分配一次,所以就是共用的;2 类的静态函数:类的静态函数是在该类的范畴内的全局函数,静态成员函数不含this指针不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数,静态成员函数可以继承和覆盖,但无法是虚函数。3 只在cpp内有效的全局变量:在cpp文件的全局范围内声明:static i
16、nt g_value = 0; 这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量;如果在一个头文件中声明:static int g_value = 0; 那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的。顺便说一下如何声明所有cpp可共享的全局变量,在头文件里声明为extern的:extern int g_value; / 注意,不要初始化值!然后在其中任何一个包含该头文件的cpp中初始化(一次)就好。然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一
17、个变量。4 只在cpp内有效的全局函数:在cpp内声明:static void func();函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;道理和如果不使用static会引起的问题和第3点一样;不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则在cpp内部声明需要加上static修饰。8 virtual:虚函数是C+中用于实现多态的机制、核心理念就是通过基类访问派生类定义的函数,子类重写基类的虚函数必须有相同的参数表和返回值、虚函数多
18、重继承后还是虚函数,具有纯虚函数的类是抽象类、相当于接口只是声明了没有定义且不能实例化、靠子类去实现,虚函数可以直接使用、也可以被子类重载后以多态的形式调用,纯虚函数必须在子类中实现才可以使用、纯虚函数在基类只有声明没有定义,虚函数和纯虚函数都可以在子类中重载后以多态的形式调用。为了完成晚绑定,编译器对每个包含虚函数的类创建一个表(称为VTABLE) 。在VTABLE中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为vpointer(缩写为VPTR) ,指向这个对象的VTABLE。通过基类指针做虚函数调用时(也就是做多态调用时) ,编译器静态地插入取得这个VP
19、TR,并在VTABLE表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。9 operator:返回类型operator 运算符符号(参数说明) 函数体的内部实现,运算符重载函数的使用、一是作为类的友元函数进行使用、二是作为类的成员函数进行使用,运算符重载可以让其能被更广泛的使用而不是局限于int,float等类型、它可以按照你在函数中的定义进行两个类等其他类型之间的运算。运算符的重载实际上是函数的重载。10 template:函数、类模板,能使对同种类型数据结构仅定义一次、根据给定的模板参数生成函数、类实例。 / 类模板的用法Template class CList; / 函数模板的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 数据结构
限制150内