1、如果.h文件中声明了一个static全局变量,且多个源文件中使用#include包含了该头文件,则:
多个源文件中都包含一份单独的拷贝,且初始值相同。这些拷贝之间相互独立,如果改变其中某个静态全局变量的值,不会影响静态全局变量的其他拷贝。
2、内联函数和宏定义的区别:
- 内联函数:在编译阶段展开;是一个函数,具有函数的基本性质,可以像普通函数一样调试;作为类的成员函数时,可以访问类成员,this指针也可以使用。
- 宏定义:在预处理阶段展开;仅仅是字符串替换;宏定义函数无法成为类的成员函数。
3、sizeof
- 是一个单目运算符,并不是一个函数;
- sizeof可以返回结构体的大小,但是不能返回结构体成员变量的大小。
4、内存对齐
- 数据对齐:在处理结构体中的成员时,成员在内存中的起始地址编码必须是成员类型所占字节数的整数倍。
- 结构体sizeof计算的结果,必须是结构体中,占用空间最多的成员所占空间的整数倍。
5、main函数执行前后发生了什么?
执行之前:调用全局对象和静态对象的构造函数;初始化基本数据类型的全局变量和静态变量。
执行之后:调用在atexit函数中注册的函数,调用顺序和注册顺序相反。
6、内容相同的字符串常量,在字符串常量区中只有一份拷贝。
7、当数组名作为参数时,相当于传递了数组首元素的地址,而且只要实参是地址,那么形参一定是指针。
一下四种声明方式是等价的:
void equal(int* a, int* b);
void equal(int a[], int b[]);
void equal(int a[1], int b[2]);
void equal(int a[100], int b[100]);
8、 句柄
句柄是一个32位的无符号整数,是一个对象的内存地址列表的整数索引,是分配给资源的唯一标识。(这里的对象是指:诸如应用程序实例、窗口、位图、GDI之类的资源对象)
句柄不是直接指向资源对象,而是保存着一个资源对象在资源注册列表中的索引。解决的是资源对象物理地址发生变化导致的访问失效问题。
句柄和指针的区别:
- 使用上:指针可以直接修改指针指向的内容;句柄只能调用一些Windows提供的API函数,防止用户随意修改系统资源。
- 概念是:指针可以随意指向一个对象;句柄只能间接的指向资源对象。
9、函数指针
定义函数指针时,需要指明所指向函数的返回值类型和参数列表类型。
数据类型(* 指针变量)(参数列表)
int max(int a, int b);
int(*p)(int, int);
p = max;
int z = p(1, 2);
10、常量引用
不可以使用:
int &a = 10;
需要使用常量引用:
const int &a = 10;
实际上,编译器内部是分两步执行的:
- 首先,将常量存放在一个临时变量中;
- 然后,使用这个临时变量初始化常量引用。
int temp = 10;
const int &a = temp;