简答(3)

1.简述数组与指针的区别

(1)空间分配

指针是动态分配空间,通过malloc在堆上分配所需要的空间,分配的空间不一定连续,在使用完之后需要调用free()来释放分配空间。而数组是静态分配空间,在全局变量区或者栈

上分配空间,分配的空间是连续的,局部变量在生命周期结束后自动释放,全局变量在程序结束完自动释放。
(2)访问效率
指针是通过地址间接访问,而数组是直接访问数值。因此指针的访问效率低,数组的访问效率高。
(3)安全性
指针使用不当会造成内存泄漏,数组使用不当会造成数组越界。
(4)函数参数
数组要用相应的指针当形参,而指针要用指针的指针来当形参。
(5)字节大小
指针的字节大小是固定的,由操作系统决定。数组的字节大小由数组大小和数组指向的类型共同来决定。
(6)标识符
指针名是变量,数组名是指针常量。所以指针p可以进行p++,而数组名不可以用于a++。
(7)对应的内存空间
指针保存的是地址,数组保存的是数值。


2.关键字const是什么含义,有什么作用


constant也就是常量的意思

const是将一个变量,添加到符号表内,程序编译时,编译器会略过符号表,提升效率,优化了程序。



3.const 与 #define 相比,有何优点


首先阐述两者区别
就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。

综上所述const有以下几个优点
(1)const常量有数据类型,编译器可对其类型进行安全检查
(2)const常量可进行调试
(3)const可节省空间,避免不必要的内存分配,提高效率


4.什么是预编译,何时需要预编译


预编译又称为预处理 , 是做些代码文本的替换工作。

处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。

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

C 编译系统在对程序进行通常的编译之前,首先进行预处理。
 c 提供的预处理功能主要有以下三种:
 1 )宏定义 
 2 )文件包含 
 3 )条件编译
何时需要预编译:
总是使用不经常改动的大型代码体。
程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个“预编译头”


5.在C++程序中调用被C编译后的函数,为什么要加上extren“C”


你如果不加会出现连接错误(XX函数未定义),因为C++语言和C语言对编译后的函数符号和外部变量符号的修饰方式不一样,代码编译过后,连接器解析外部符号的时候就会出现无法解析外部符号的错误。你加上extern“C”之后,C++编译器就会按照C语言的符号修饰规则对函数进行修饰,这样连接器就能够正确解析。













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值