C++知识点总结

第一章 C/C++程序设计

——来源于程序员面试宝典知识点总结、C++Primer

1. 位操作

判断一个数X是否是2的N次方:if(!X & (X-1)); 将a、b交换:a = a^b; b = a^b;; a = a^b;

2. 变量作用域

3. 堆和栈的区别

这里的堆和栈,是指内存空间中的概念,不是数据结构中的堆和栈。这里之所以叫堆,是因为该块内存空间中第一个元素有最高优先权。这里之所以叫栈,是因为该块内存空间满足先进后出的数据结构。

经常需要操作的内存可分为以下几类:

(1)栈区(stack):由编译器自动分配和释放,速度快,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。栈是向低地址扩展的数据结构,其最大容量是系统预先规定好的,较小,若申请的空间超过栈的剩余空间,将提示overflow。 在栈上的数组比指针所指向的字符串(例如堆)快。

(2)堆区(heap):一般由程序员分配和释放(动态申请的空间,malloc和new),若程序员不释放,程序结束时可能由操作系统回收。操作系统维护一个记录空闲内存地址的链表,当系统收到空间申请时会遍历该链表,找到第一个空间大于申请空间的堆节点,并且在这块空间的首地址处记录本次分配的大小,以保证以后可以正确释放。

堆是向高地址扩展的数据结构,堆的大小受限于计算机系统中有效的虚拟内存,较大。不过容易产生内存碎片。Windows下使用VirtualAlloc分配内存,最快、最灵活,不是在堆也不是在栈,而是在进程的地址空间中保留一块内存。

(3)全局区(静态区,static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的在相邻区域。程序结束后由系统释放。

(4)文字常量区:常量字符串就放在这里,程序结束后系统释放。

(5)程序代码区:存放函数体的二进制代码。

4. 函数调用的原理

函数的形参在函数未调用之前不会分配空间。 调用函数时首先进行参数压栈,一般情况下压栈顺序为从右到左,最后压函数地址。 在函数调用时,第一个进栈的是主函数中的下一条指令的地址,然后是各个参数。大多数C编译器,参数是由右往左入栈的,然后是函数中的局部变量。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中下一条可执行指令,程序由该点继续运行。

ESP寄存器存放当前线程栈顶指针,EBP寄存器存放当前线程的栈底指针,EIP寄存器

存放下一个指令存放的内存地址。

5. printf的内部实现机制

printf计算参数时是从右到左压栈的。 float会自动转换成double型。

6. 类型转换

7. 运算符优先级

取反 优先于 加减 优先于 其它位运算符

8. 指针

指针可以是0值。

函数指针:void (*f) ()

函数返回指针:void* f()

const指针:const int* variable

指向const变量的指针:int* const variable

指向const变量的const指针:const int* const variable

指针数组:一个数组里面都是指针 int *ptr[5]

指向数组的指针;数组里面元素时int型,指针指向这个数组 int (*ptr)[5]

对于一维数组,数组名本就是指针,在前面加上&,就变成双指针,代表一个二维数组,加1就是在原地址基础上加一行。就会指向原一维数组末了元素的下个位置。

9. 迷途指针

也叫悬浮指针,是当对一个指针进行delete操作之后,虽然释放了内存,但是并没有把它设置为空。而后,如果再次试图使用该指针,会引起不可预料的结果。

10. 内部连接与外部链接

11. 各个类型的数值范围

int long unsigned long

12. mutable

13. sizeof与strlen

对于类、结构体的大小,得注意数据对齐问题。 strlen是计算字符串的长度,直到’\0’为止,不包括’\0’。

14. 静态变量

静态变量存放在全局数据区,而sizeof计算栈中分配的大小,如果结构体中含有静态变量,结构体大小是不包括静态变量。

15. 成员变量

成员变量初始化顺序由声明顺序决定。

静态成员变量在一个类中,供所有对象共享,三字连珠的程序可以感受到。

16. 内联函数

编译时候替换。

17. 编译、链接的机制

对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。

18. 引用

引用不能指向空值。

19. malloc/free和new/delete

20. 句柄

句柄是一个32位的整数,是一个指向指针的指针,主要维护一个对象的地址。Windows是一个以虚拟内存为基础的OS,内存管理器经常在内存中来回移动对象的真实物理地址,以满足各种应用程序的内存需要。那么为了始终能找到被移动的对象,Windows为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存的地址变化,而这个地址本身是不变的,这个地址就是句柄。

21. 智能指针

22. 虚函数

23. 构造函数

默认构造函数、含参构造函数、拷贝构造函数

24. 友元

25. 结构体位制

struct A

{

}; int x:17; int y:9; int z:17;

26. cast机制

C++有4个类型转换操作符:const_cast、static_cast、dynamic_cast和reinterpret_cast。

27. 字符串与整型的互相转化

字符串转化为整数,可以采用每一位间’0’再乘10累加的方法。

i = atoi (char*);

整数转化为字符串,可以采用加’0’,再逆序的方法。

itoa (i, char*, 10);也可以使用sprintf(s, “%d”, 123);

28. 字符串与字符数组的区别

最明显的区别就是字符串会被默认地加上结束符’\0’。

对于字符串和字符数组的输出原则是遇到’\0’为止。

第二章 基础算法

 

第二篇:c语言知识点总结

二级C语言基础知识点总结

第一章

  1,函数是从主函数(main())开始执行,回到主函数(main())结束;

  2,一个程序的编译是从第一个函数(语句)开始,到最后一个函数(语句)结束;

第二章

  1,算法的特性:有穷性,确定性,有一个或者0个输入,有一个或者多个输出;有效性

  2,算法(程序)的几个结构:选择结构,顺序结构,循环结构

第三章 

1,int类型是2个字节,float是4个字节,dooble是8个字节

  2,数据类型分为:基本类型(整型,实型,字符型,枚举型),指针类型,构造类型(结构体类型,数组类型,共用体类型),空类型(空类型合法哦,不要忘记了这个特殊哦

  3,变量的地址是确定的,变量变的地方只是地址里面的值。

  4,用户标志符,由数字,字母,下划线构成,第一个不能是数字,但是32个关键字除外。

  5,注意int的最大表示范围是-32768――+32767,当超过这个范围的时候,即以%d输出+32768时结果为-32768

  6,长整形(long)表示方法是在数字后面加L,如果一个变量a=3,那么表示的是一个整形的3,如果是a=3L,那么就是长整形的3;当分别以%o,%ld,%x (8进制,长整形,16进制)输出的时候,结果没有前面的00X,和后面的L

   例:int a=075,b=ox14;long int c=5L;

        printf(“%o,%x,%ld”,a b c);  结果为75145

  7,当出现’\0’的什么时候为结束,什么时候为八进制的转义字符:’\0’后面有17之间的数字的时候为转义字符;其他的时候为字符串结束标志,注意转义字符有哪些(参考书p8)

  这样一个例题 若 strlen(”abc\089”)=3    strlen(“abc\012”)=4

  8,强制转换不会改变一个变量的值,只是改变其作用的那个表达式的值。

  9,++,――,当++,——,在变量后面的时候表示在本次运算的时候会改变,在下次引用或者参与运算的时候才会自变;当++,――,在变量的前面的时候则是在本次运算就发生自变(顺便掌握++,――结合性是右结合,若i+++j等价于(i++)+j;

  10,复合运算符要注意当等号后面接的是表达式的时候要把表达式看成一个整体即x *=y+8等价于x=x*(y+8),y8是一个整体

第四章

   1,格式输入和输出的时候,注意格式。要严格按照题目的格式进行操作。(在做题的时候尤其是读程序写结果的时候要细心哈!)

   2,%d,%md,%m..nd, %e,以及相应的几种格式是什么意思,参考书p13

第五章

   1,关系运算符,>,<,<=,>=,= =,!= ,==和!=优先级最低,主意=与==的区别:=是赋值的意思,表达式的值是对变量赋的值,==是关系运算符,关系运算表达式的值为0或者1.

   2,逻辑运算符,&& ,||,!在这几个中优先级!> && > ||,优先级是体现在结合性上而不是运算的先后性上。例如

           a=b=c=1;d=++a||++b&&++c在这个里面&&最高那就是加粗部分先看成一个整体,运算顺序还是从++a开始,即做完这个运算后,可以依次判断出后边的运算式子没有必要计算了,所以d=1,a=2,b=1,c=1

   3,if语句基本格式:1有else的情况是:if(表达式)语句;else语句;(注意有分号哦),2没有else的情况是:if(表达式)语句;当有多个if和else的时候if是与其后最近的没有配对的else结合;注意,当函数作为if里面的表达式的时候即if(printf(“*”))的时候,则是以函数的返回值判断if的真假,printf输出以1个字符则返回为1,所以这个if是真的;

  4条件表达式,? :  ;右结合性,是从右往左结合,即是以最后一个?开始结合,但是计算顺序仍然是从左到右(这个牵涉到++,--问题)(参考书p16)

  5,switch语句,switch语句只有碰到break或者做到最后一个语句才结束,case和default语句都只是入口。(参考书p17页例子)

第六章

  1,while语句基本格式是while(表达式)语句;注意在while()后面没有;号,当函数或者赋值表达式放在while的()中时与if的判断方法一样,时候函数的返回值或表达式值的逻辑值;

  2,do{  }while();语句和while语句的区别在于前者先做后判断后者是先判断后做,这个知识点多参考书上(p18例题)和卷子上的题

  3,for语句,例如:for(i=1;i<100;i++)                   

                          s=s+i;注意for括号的后面没有;号,

                   当有两个for语句即嵌套的for循环的时候   例如:

                  for(i=1;i<4;i++)                   

                   forj0j<5;j++ 

ssi ;  这个时候是先做i=0;然后判断i;然后做加粗的部分,即是把加粗部分看成一个整体做完之后才会回到i++;所以ssi ;这个语句做了20次,(参考书p19例题)

  4,总结if,for,whlie,后面如果没有{}的时候,即是只有一个简单的语句的时候,if,for,whlie的作用效力范围是到与之最近的分号结束;当有{  }的时候即是把{  }看成一个整体,控制范围是整个{  }里面的所有语句。

  5,break是结束整个循环;contine结束本层循环;具体参考书(p19页例子这个很重要哦,一定要掌握)

第七章和第十章(重点哦!!!!!!)

  1,维数的判断,当*,[]前面有int ,char,float等常见的类型名的时候表示是在定义,一个 * 或者[]表示升一维,当表达式前面没有int ,char,float的时候则是在引用(或称为使用)一个*或者[ ]表示降一维;

  2,注意这样一些东西:int a[3][3],**p=a则, a[0]等价于*p表示的是这个2维数组的第一行或者说是这个2维数组的首元素的地址;a[i]等价与*(p+i)都表示是数组的第i行或者是第i行的首元素的地址;所以要引用这个a数组的元素应该用a[i][j]或者**p

  3,对一个数组的输入输出总结

当数组是int(整形的时候)

一个有n个元素的1维数组:输入   for(i=0;i<n;i++)   

                                   scanf(“%d,&a[i]”);

        输出    for(i=0;i<n;i++)

                  printf(“%d”,a[i]);注意int类型要以%d的格式

一个有n行m列的2维数组:输入:for(i=0;i<n;i++)(这里i控制行,j控制列)

                                    for(j=0;j<m;j++)

                                       scanf(“%d”,&a[i][j]);

                           输入:for(i=0;i<n;i++)

                                    for(j=0;j<m;j++)

                                       printf(“%d”,a[i][j]);(注意在输入的时候才有&符号,输出的时候没有)

一个字符串数组即 char a[10];对这个的输入有两种方式

(1)for(i=0;i<n;i++)

       scanf(“%c”,&a[i]);

(2)gets(a); scanf(“%s”,a)(注意这两种方式的括号里面的只能是一个数组名)

输出也对应有两种方式:(1),for(i=0;i<n;i++)  

                                 printf(“%c”, a[i]);

               (2)puts(a);printf(“%s”,a);注意这两种方式的括号里面的只能是一个数组名;

  4,对一个有n个元素的数组的遍历(既是说从第一个成员访问到最后一个成员)有以下两种方式:

1,  for(i=0;i<n;i++)                     2,for(i=0;a[i]!=’\0’;i++)      

       a[i];     (都是指从a[0]访问到a[n1]        a[i];  参考书p31

  5,对字符串的操作注意:sizeof是一个系统关键字,不是函数,求其后边的参数占用的内存空间,strlen 求字符串中有多少有效字符。

   注意这个例题:char a[30]=“abc\0b”;   sizeof(a)=30 ;   sizeof(“abc\0b”)=6;

                                   strlen(a)=3   strlen(“abc\0b”)=3 ;

  6,*p++  表达式中p与++先结合,取完值之后地址指向下一个元素的地址;*++p则是直接输出第二个元素,指针输出完之后,也指向了下一个元素的地址

  7,char a[10];    while(a[i])和while(a[i]!=‘\0’)都是表示当a数组不结束的情况下继续循环,一般就是指访问整个数组

  8,自编函数实现求字符串的长度:

          int  fun(char  *a)               int fun(char  *s)

             {  int  k;                    {   char *p;

p=s

                whlie(a[k])                       whlie(*p)

                   k++;                          p++;

                retrun(k-1);  }                    retrun(p-s);    }

第八章

  1,分清形参和实参的区别:(1)形参是在定义或声明中,实参是在引用当中;当函数名前有int ,float, char等类型名时是定义或者声明,但是要排除省略类型名的情况;一般引用出现在主函数中,(2)形参是不确定的值,因此不能为常量,实参是确定的值所以可以为常量

  2,当实际参数是一个变量的时候,实参向形参传递值,只是个简单的值传递,不会改变实参的值;当是实参是地址传递的时候就要改变

  例:(1),int subint xint y

{   int c=x;x=y;y=c;}

  void main()

{  int a=3,b=2;subab

printf(“%d,%d”,a,b);}  结果是 3,2

(2),int subint* xint *y

{int c=*x;*x=*y;*y=c;}

void main()

{int a=3,b=2;sub&a&b

printf(“%d,%d”,a,b);}  结果是 2,3

  3,局部变量和全局变量;注意分清各自的作用范围;参考书p64 第4题

  4,注意形参和实参必须赋值兼容,也就是说形参和实参维数必须一样;注意区别viod和return;当主函数里面带参数的形式,main(int argc,char *argv[])中argc是表示参数的个数,argv这个数组储存的是具体的参数个数。例,

void main(int argc,char *argv[])

       {   char  **p ;

while(――argc)

{  *p=argv[argc];

puts(*p); }

}  若输入为 china Beijing flie     则结果为:flie  Beijing ;

  5,注意函数的调用以及静态变量;参考各次卷子中关于这个方面的题

第九和十一章

 1,宏替换的时候只是简单的字符替换,不要加任何东西,宏名中不能包含空格;

例:#define xx(m) m*m

 …… int i=5;

i=i+xx(4+5);

    结果为 i=5+4+5*4+5=34;

 2,宏替换是在预编译的时候进行,所以不占用程序运行时间;宏名是无类型的;

 3,结构体变量的长度是各个成员长度的和;当结构体指针和数组的时候注意分清 . 和->的区别;参考书中p59第3题

 4,共用体变量的长度是由成员中的最长的成员决定;

 5,链表的题就掌握模拟考试题中的一道选择题就可以了;第十一章的其他内容,还是要去看书了解 

第十二章和第十三章

 1,位运算符有 | (或)即只要有一个1就是1,  &(与)要全部为1才为1   ^(异或)要不相同才为1 ;注意的是当向左移动n位就是乘以2的n次方;向右移动n位就是除以2的n次方。

 2,文件,c语言中可以认识两种文件存储类型(1),文本文件(2),二进制文件;

 3,打开文件操作注意语句  if((fpfopen(“文件名”,“r”))==NULL;当等于NULL的时候就不能打开;注意文件打开之后必须关闭,即是fclose(fp);这两个必然是成对出现;

 4,文件在什么情况下结束(1),fp==EOF的时候结束fp!=EOF的时候不结束。

(2),当feoffp)返回值为0时不结束,返回非零时就是结束;

 5,注意背下书p139第2题,万一考到文件的编程一般就是这种题。一般填空就是上面的加粗部分。

 6,w,r,a分别表示对文本文件的读,写,追加;fputs(ch,fp)指将ch变量输出到文件fp中;ch=fgets(fp)指的是从文件中得到一个字符赋给变量ch;fread或fwrite(buffer,size,num,fp)中,buffer指的是文件读出/写入的数据的地址,是一个数组名或者指针;size,指读出或者写入每个数的字节数;num指读出和写入多少个数;fp指文件指针。

  

编者的话:

这些只是基础知识的重点,目的是帮助大家复习基础知识(记住这个只是基础的一部分,仅仅是基础,各个基础知识的运用请大家多参考发的卷子和书后面的习题),大家还是争取要把书细细的看上2遍以上,最后祝大家都能顺利的过二级。

                                 

                                        作者:好老师工作组                                          

 
相关推荐