1、关键字static的作用?谈谈你的理解和你曾经怎么使用的?
解答:1)隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。
(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0×00,某些时候这一特点可以减少程序员的工作量2、“引用”与“指针”的区别?
解答:引用是对象的别名, 操作引用就是操作这个对象, 必须在创建的同时有效得初始化(引用一个有效的对象, 不可为NULL), 初始化完毕就再也不可改变, 引用具有指针的效率, 又具有变量使用的方便性和直观性, 在语言层面上引用和对象的用法一样, 在二进制层面上引用一般都是通过指针来实现的, 只是编译器帮我们完成了转换. 之所以使用引用是为了用适当的工具做恰如其分的事, 体现了最小特权原则.
3、#include<file.h> 和 #include “file.h”的区别。
解答:对于#include <file.h> ,编译器从标准库路径开始搜索 file.h对于#include“file.h” ,编译器从用户的工作路径开始搜索 a.h
4、关键字const有什么作用,是什么含义?谈谈你对下面的认识。
指明变量或对象的值是不能被更新,引入的目的是为了取代预编译指令
const int a; 说明a是一个常量 不能被改变
int const a; 与上一个一样
const int* a; // const修饰指向的对象,a可变,a指向的对象不可变
int *const a; //a的地址不可以改变 但是a的值可以改变
int const*a const; //a的地址和a的对象都不可以改变
5、请说出const与#define的区别,并作出比较。
C中是使用宏#define定义, C++使用更好的const来定义。
区别:
1)const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到的错误(边际效应)。
2)有些编译器可以对const常量进行调试,不能对宏调试。
6、分别写出bool, int ,float, 指针类型的变量a与”零”比
较的语句。
If(flag) {A;} Else {B;}
If(0== flag) {A;} else {B;}
If(NULL== flag){A;} else {B;}
7、写一个标准宏。
#define MAX 50
8、主函数被什么调用?为什么要返回0?
主函数的作用是程序入口点,只有进入这个入口才能完成里面的函数调用,-1 ,0,1 返回0证明程序没有问题
9、在字节对齐为4的情况下,求sizeof(name)=12
struct name
{
char str;
int num;
short x;
};
10、谈谈你对heap和stack的理解?
解答:
1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3)从堆上分配(动态内存分配)程序在运行的时候用malloc或new申请任意多少的内存,程序员负责在何时用free或delete释放内存。动态内存的生存期自己决定,使用非常灵活。