笔试训练2

1、数组和指针的区别

(1)、空间分配

指针是动态分配空间,通过malloc在堆上分配所需要的空间,分配的空间不一定连续,在使用完之后需要调用free()来

释放空间。而十足是静态分配空间,在全局变量区或者栈上分配空间,分配的空间时连续的,局部变量在生命周期结束后

自动释放,全局变量在程序结束完自动释放。

(2)、访问效率

指针是通过地址间接访问,而数组是直接访问数值。因此指针的访问效率低,数组的访问效率高。

(3)、安全性

指针使用不当会造成内存泄漏,数组使用不当会造成数组越界。

(4)函数参数

数组要用相应的指针当形参,而指针要用指针的指针当形参。

(5)字节大小

指针的字节大小是固定的,由操作系统决定。数组的字节大小由数组大小和数组指向的类型共同决定

(6)标识符

指针是变量,数组名是指针常量。所以指针p可以进行p++,而数组名不可以用于a++。

(7)对应的内存空间

指针保存的是地址,数组保存的是数值。.

2、const和#define的区别

就起作用的阶段而言:#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用

就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,

可以避免一些低级的错误。

就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;

const定义的只读变量在程序运行过程中只有一份备份。

从代码调试的方便程度而言:const常量可以进行调试的,#define是不能进行调试的,因为在预编译阶段就已经替换掉了。

综上所述const有一下几个优点

(1)const常量有数据类型,编译器可以对其类型进行安全检查

(2)const常量可以进行调试

(3)const可节省空间,避免不必要的内存分配,提高效率

const是将一个变量添加到符号表里,编译程序时略过这个变量,提高效率,优化代码

3、什么是预编译?何时需要预编译?

预编译又成为预处理,是做些代码文本的替换工作。处理以#开头的指令,比如拷贝#include包含的文件代码,#define

宏定义的替换、条件编译等,就是为编译做的预备工作的阶段。

主要处理#开始的预编译指令,预编译指令芝士了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

C编译系统在对程序进行通常的编译之前,首先进行预处理。C提供的预处理功能主要有一下三种:

(1)宏定义   (2)文件包含   (3)条件编译

何时需要预编译:

总是使用不经常改动的大型代码体。

程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译

为一个“预编译头”。

4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?

C++语言支持函数加载,C语言不支持函数加载,函数被C++编译后在库中的名字与C语言的不同,假设某个函数的原型

为:void  foo(int  x,  int  y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生想_foo_int_int之类的名字。

C++提供了C链接交换指定符号extern“C”来解决名字匹配问题。

你可能感兴趣的:(笔试训练2)