指针和引用区别?
引用只是别名,不占用具体存储空间,只有声明没有定义;指针是具体变量,需要占用存储空间。
- 引用在声明时必须初始化为另一变量,一旦出现必须为typename refname &varname形式;指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体变量。
- 引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。
- 不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。
宏定义和函数有何区别?
-
宏在编译时完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。
-
宏函数属于在结构中插入代码,没有返回值;函数调用具有返回值。
-
宏函数参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型。
-
宏函数不要在最后加分号。
宏定义和const区别?
-
宏替换发生在编译阶段之前,属于文本插入替换;const作用发生于编译过程中。
-
宏不检查类型;const会检查数据类型。
-
宏定义的数据没有分配内存空间,只是插入替换掉;const定义的变量只是值不能改变,但要分配内存空间。
宏定义和typedef区别?
-
宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名。
-
宏替换发生在编译阶段之前,属于文本插入替换;typedef是编译的一部分。
-
宏不检查类型;typedef会检查数据类型。
-
宏不是语句,不在在最后加分号;typedef是语句,要加分号标识结束。
-
注意对指针的操作,typedef char * p_char和#define p_char char *区别巨大。
宏定义和内联函数(inline)区别?
-
在使用时,宏只做简单字符串替换(编译前)。而内联函数可以进行参数类型检查(编译时),且具有返回值。
-
内联函数本身是函数,强调函数特性,具有重载等功能。
-
内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了。
条件编译#ifdef, #else, #endif作用?
-
可以通过加#define,并通过#ifdef来判断,将某些具体模块包括进要编译的内容。
-
用于子程序前加#define DEBUG用于程序调试。
-
应对硬件的设置(机器类型等)。
-
条件编译功能if也可实现,但条件编译可以减少被编译语句,从而减少目标程序大小。
区别以下几种变量?
const int a;
int const a;
const int *a;
int *const a;
-
int const a和const int a均表示定义常量类型a。
-
const int *a,其中a为指向int型变量的指针,const在 * 左侧,表示a指向不可变常量。(看成const (*a),对引用加const)
-
int *const a,依旧是指针类型,表示a为指向整型数据的常指针。(看成const(a),对指针const)