备忘

     快毕业了,就要找工作了,还有老多东西都给忘了,先整理一下,备忘,也给需要的朋友和我一个方便,如果你有好的资料,希望能和我分享!

**getchar()和getch()**

       getchar()是stdio.h中的函数,等待用户输入直到按下enter键(前提是前提是stdin缓冲区无任何数据,包括回车符,如果stdin有数据,则直接读取前面的一个数据(scanf语句也受此影响,也是直接读取前面的一个数据,包括回车符),读取玩就结束,不等回车,),有屏幕显示

      getch()是conio.h( console io)中的函数,直接从键盘活动键值,不等用户按回车,不会在屏幕上显示,多用于程序调试,在关键位置显示有关的结果(他的输入不会影响下一个的读取,其他的就和getchar()没有什么区别了)

      stdin, 若要清除 C 中键盘缓冲区使用函数 rewind() 该要与默认键盘。 函数 fflush() 清除缓冲区, 在流级 I/O C 程序使用。 它并不清除设备缓冲区。 下面是示例显示当键盘缓冲区不清除, 发生什么以及如何清除它然后:

**scanf("%s",a)h和gets(a)的区别

     scanf不能输入空格,碰到空格截断

     gets可以输入空格,即把空格当成其输入的一部分

**操作字符串**

    首先需要引入命名空间<string.h>,虽然c不支持直接的string型,但是要使用strcpy,strcat等操作这个命名空间是必需的,后来在c++中引入了string类型,同时命名空间也变成了#include "string"和using namespace std;记住是string而不能写成string.h否则会报错的,这样呢在c++中操作字符串就得到了很多简化,如:直接用string声明变量,变量可直接赋值;可用“+”号连接字符串,不必用strcat;可直接用“==”“>=”“<=”逻辑比较,不必用strcmp(-1表示小于,0等于,1大于);可直接用“=”“+=”进行传值,不必用strcpy;可直接用“<<”“>>”进行字符串的流输入、输出。值得注意的是如果混用c和c++的各种操作符就非常有 可能会报错了,最简单的如声明了string变量却用printf输出等。

**sizeof和strlen**

   这两个都是c的,在c++中是stringName.size()和stringName.length();参数形式为sizeof(char *)和strlen(char *);需要说明的是sizeof是算符,strlen是函数,sizeof可以用类型做参数,strlen只能用char*做参数,且必须以"\0"结尾,sizeof还可以用函数做参数,数组做sizeof的参数不退化,传递给strlen就退化为指针,即sizeof的为数组的大小,而strlen的为指针的大小,为常数了!

**c++中的全局宏**

The following macro names are defined at any time:

 

macro value
__LINE__ Integer value representing the current line in the source code file being compiled.
__FILE__ A string literal containing the presumed name of the source file being compiled.
__DATE__ A string literal in the form "Mmm dd yyyy" containing the date in which the compilation process began.
__TIME__ A string literal in the form "hh:mm:ss" containing the time at which the compilation process began.
__cplusplus An integer value. All C++ compilers have this constant defined to some value. If the compiler is fully compliant with the C++ standard its value is equal or greater than 199711L depending on the version of the standard they comply.

**模板,多态,继承,接口**

  这些都是实现重用的一些方法(自定义类型的转换都是通过指针实现的),详细如下:

  模板:模板将类型参数化,实现的是源代码的重用,使用方法,就是在函数模板或者是类模板的签名加上 templete<class name>或者template<typename name>,他们是等效的,然后在其下的过程中用name来替代所需的类型名称,在调用时,需要指定类型,在调用时如:func<int>(参数);或者myclass<int>.什么的,其实一般都不需要指定那个<int>之类的,他是自己去替换的。

  多态:多态实现的是接口的重用,即用同一个函数名根据不同情况去调用不同的功能。有函数多态和动态多态,还有和模板啊,宏之类的结合产生的多态,比如,函数多态包含重置和宏多态,因为宏本来就是没有类型的,也算多态的一种了,动态多态则是及继承和虚函数为基础的。

  继承:公有继承可以理解为is-a关系,私有继承可以理解为has-a关系,这是因为共有继承后可以在子类的对象里面访问父类中的public成员,只是在其上加了一些东西而已,表现上为is-a关系,而私有继承则在子类的对象中访问不到任何父类中的成员,只是在类的内部可以操作父类的共有成员,表现为has-a关系.如果要实现接口的重用,即声明父类来调用子类的对象,fahher *myson=new son(构造函数的参数);(这样以来就将操作限定在father类中的公共操作上了)

**数据结构**

  数据结构的作用可以简单的理解为,为方便按照我们的方式完成需要的功能,我们需要让数据结构化,一个好的数据结构将为后期的处理带来事半功倍的效果

**单链表**

    用一组任意的存储单元来存放线性表的节点(由于是任意的存储单元所以其虽然是逻辑上连续的,但是在物理上却不一定就是连续的,所以它至少包含两部分:值和下一个节点的位置)

    链表由头指针唯一确定,但列表可以用头指针的名字来命名,但链表中的每个节点的存储地址是存放在其前驱的next域中,而开始节点无前驱,故头指针head指向开始节点。终端节点无后继,故终端节点的指针域为空,即null

**malloc**realloc**calloc

void* malloc(unsigned size); void* calloc(size_t nelem, size_t elsize); 和void* realloc(void* ptr, unsigned newsize);都在stdlib.h函数库内,是C语言的标准内存分配函数。

1. 函数malloc()和calloc()都可以用来动态分配内存空间。malloc()函数有一个参数,即要分配的内存空间的大小,malloc 在分配内存时会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据 malloc 实现策略的不同,malloc 每次在分配的时候,可能分配的空间比实际要求的多些,多次分配会导致更多的这种浪费。当然,这些都和 malloc 的实现有关;calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。如果调用成功,它们都将返回所分配内存空间的首地址。

2. 函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。

3. realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。

4. realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。所以在代码中,我们必须将realloc返回的值,重新赋值给 p :

p = (int *) realloc (p, sizeof(int) *15);

 




你可能感兴趣的:(备忘)