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”来解决名字匹配问题。
2285

被折叠的 条评论
为什么被折叠?



