1.#define和const的联系与区别
联系:#define和const都是定义常量的一种方法
区别:
(1)编译器处理方式不同:
#define定义的常量在预处理阶段展开
const常量在编译运行阶段使用
(2)类型不同:
#define定义的常量没有类型,只进行简单的替换,可能会有多个拷贝,占用的内存空间较大
const定义的常量有类型,存放在静态存储区,只有一个拷贝,占用的内存空间小
(3)安全检查不同:
#define不会进行安全类型检查
const会进行类型安全检查,安全性更高
(4)const可以定义函数,#define不可以
2.指针和引用的区别
联系:指针和引用都是地址的概念
指针指向一块内存,它的内容是所指内存的地址;
引用是某块内存的别名
区别:
(1)指针有自己的一块空间,引用只是一个别名
(2)使用sizeof,一个指针的大小是4,引用的大小为被引用对象的大小
(3)作为参数传递时,指针需要被解引用才能对对象进行操作,直接对引用进行修改会改变引用所指的对象
(4)指针有const,引用没有const
(5)指针在使用中可以指向其他对象,引用只能是一个对象的引用,不能改变
(6)指针可以为空,引用不能为空
(7)指针可以多级指针,引用只有一级
(8)指针和引用使用++运算符的意义不一样
(9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露
3.在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?
C语言和C++语言的编译规则不一样,加入extern“C”声明为了告诉系统哪些函数使用C方式编译,哪些函数使用C++方式编译。如果不加extern“C”,系统会提示找不到该函数。
extern“C”的主要作用是为了能够正确实现C++代码调用其他C语言代码。加上extern“C”后,会指示编译器这部分代码按照C语言的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;C语言不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。这个功能十分有用,因为在C++出现以前,很多代码都是用C语言写的,而且底层库也是C语言写的,为了更好支持原来的C代码和已经写好的C语言库,需要在C++中尽可能地支持C,而extern“C”就是其中一个策略。
4.指针类型的大小
(1)指针类型的大小是固定的,无论该指针指向哪种数据类型,在32位系统中为4字节,64位系统为8字节;
(2)对指针类型的变量进行加减操作,实际上是对该指针变量中保存的地址进行加减操作,所以这些加减操作体现在内存地址上,就与指针指向的具体数据类型有关。指针类型本身的大小,与对指针进行的加减操作无关。