2017.03.02 C/C++小知识点

来源:互联网 发布:不锈钢橱柜品牌 知乎 编辑:程序博客网 时间:2024/06/02 18:24

1. read是Unix系统的库函数,而fread才是C中的库函数。read属于系统调用,从打开的设备或文件中读取数据。

2. int a=1,b=32. 当执行a<<b时,编译器会先将b与31进行and操作,以限制左移的次数小于等于31. b&31==0,则a<<b==1. 而直接执行1<<32 会直接进行左移操作,得到0.

3. ifndef/define/endif 的含义:如果未定义/那么定义/完成假设 一般是用来防止头文件被重复包含,提高编译效率的。

4. 字符'\0'的ASCALL码值为0

5. 结构和联合都是有多个不同的数据类型成员组成,但是在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同,从低地址开始公用);

对于union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是相互不影响的。

联合变量占有的内存空间是该联合变量中占有最大内存空间的成员在内存对齐时所需的存储空间。

联合变量是可以被初始化的,这个初始化值必须是联合第一个成员的类型,而且必须位于一对花括号里面。

6. 无符号数可以取到零,但是取不到负数。

7. 数组作为实参时,必须执行列数,否则可能产生歧义。如果我们省略了第二维的大小,编译器将不知道如何正确的寻址。

8. 带标签的语句是一种特殊的语句,在语句前面有一个标识符(即标签)和一个冒号。使用goto lable就可以跳到标签处执行。switch case语句中的case就是一种标签。

9. 非法指针:包括未分配的内存和所有已经不能访问的内存。比如指向已经返回的函数局部变量。

10. 初始化指针时,所创建的字符串常量被定义为只读,如果试图通过指针修改这个字符串的值,程序就会出现错误。如:char * s="AAA"; s[0]='B';这种语句就是非法的。

11. 接口是一种特殊的抽象类,是只包含纯虚函数的抽象类。

12.class A{}; 一个空类,虽然不包含任何信息,但是必须在内存中占一定的空间,否则无法使用这些实例,一般sizeof(A)的值为1。

13. 后置递增运算符的优先级比解引用(*)高:如*p++,则p先自增,然后再解引用。

14. malloc函数:void* malloc(unsigned int size)

      在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。

      calloc函数: void* calloc(unsigned int num,unsigned int size)

      按照所给的数据个数和数据类型所占字节数,分配一个num*size连续的空间。calloc申请内存空间后,会自动初始化内存空间为0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

      new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。

      realloc函数:void* realloc(void *ptr,unsigned int size)

      动态分配一个长度为size的内存空间,并把内存空间的首地址赋给ptr,把ptr内存空间调整为size。申请的内存空间不会进行初始化。

15. 静态分配是指在便一阶段就能确定大小,由编译器进行分配,堆不可以进行静态分配,堆的申请都是在执行过程中进行的。

      堆是使用malloc()、calloc()、realloc()等函数动态分配的,而使用alloca函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。

16. 只要出现了unsigned int 就要按照4个字节算,就算出现了位域也要按照四个字节算。

17. 构造函数初始化时必须采用初始化列表一共有三种情况:(1) 需要初始化的数据成员是对象(继承时调用基类构造函数)(2) 需要初始化const修饰的类成员 (3)需要初始化引用数据成员。  static属于类并不属于类对象,所以static成员是不允许在类内初始化的,static const成员也不能在初始化列表中。

18. 内联函数和虚函数:即使是最简单的虚函数调用,编译器的内联处理程序也对它爱莫能助(virtual的意思是“等到运行时再决定调用哪个函数”,inline的意思是“在编译期间将调用之处用被调用函数来代替”。对于虚函数来说,编译器在编译期间都不知道哪个函数将被调用,所以拒绝生成内联调用) 

19. C++中,const变量是在编译时就确定的,可以像#define一样使用,故C++中const变量的值在编译时就已经确定了,直接对const变量进行了值的替换,因此当const变量的值改变时,const变量值是不会得到更新的。

0 0
原创粉丝点击