main()
{
int b;//栈
char s[]="abc";//栈
cahr *p2;//栈
cahr *p3="123456";//123456 在常量区,p3 在栈上
static int c = 0;//全局静态初始化区
p1 = (char*)malloc(10);//分配得到的 10 字节的区域就在堆区,但是 p1 自身是在栈中
}
栈由系统自动分配,速度快,但是程序员无法控制。只要栈的剩余空间大于所申请的空间,系统将为程序提供
内存,否则将报异常提示栈溢出。在 windows 下,栈是向低地址扩展的数据结构,是一块连续的内存区域,因
此能获得空间较小。
堆需要程序员自己申请,并指明大小;堆操作:操作系统有个记录空闲内存地址的链表,当系统受到程序的申
请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将
该节点的空间分配给程序。堆是向高地址扩展的数据结构,是不连续的内存区域,而链表的遍历方向是从低地
址向高地址,堆的大小受限于计算机系统中有效的虚拟内存,因此堆的空间比较灵活,比较大。
7.const 用途?
(1)可以定义 const 常量(2)const 可以修饰函数的参数和返回值,甚至函数的定义体。被 const 修饰的东西
都收到强制保护,可以预防意外的变动,能提高程序的健壮性。
8.const 和#define 的区别?都可以定义常量
(1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行
字符串替换,没有类型安全检查,并且在字符串替换中可能会产生意想不到的错误(边际效应)
(2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试,在 C++程序中只使用
const 常量而不适用宏常量,即 const 常量可以完全取代宏常量。
9.sizeof 和 strlen 区别?
(1)sizeof 是运算符,srelen 是函数
(2)Sizeof 可以用类型做参数,strlen 只能用 char*作参数,且必须是以“\0”结尾的,sizeof 还可用函数做参数
(3)数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针
(4)大部分编译器在程序编译的时候就把 sizeof 计算过了,是类型或是变量的长度
(5)Srelen 的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小
(6)Sizeof 后面如果是类型必须加括号,如果是变量名可以不加括号
(7)当使用了一个结构类型或变量时,sizeof 返回实际大小。当使用静态的空间数组时,sizeof 返回全部数组
的尺。
(8)数据对齐:#pragma pack(n)
实例:
char* a = “01234”;//sizeof(a)=4
char b = “01234";//sizeof(b)=6 要加上隐含的“\0”
int c[100];//sizeof(c)=400;
char ss[100]=”012345”;//sizeof(s)=100;strlen=6
10.内联函数和宏的差别?
内联函数和普通函数相比可以加快程序运行的速度,因为不要中断调用,在编译的时候内联函数可以直接被镶
嵌到目标代码中,而宏只是一个简单的替换。内联函数要做参数类型检查,宏不需要。
11.指针和引用的差别?
(1)非空差别:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。如果使用一个
变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时应该把变量声明为指针。
(2)合法性区别:在使用之前不需要测试她的合理性。相反,指针则应该总是被测试,防止其为空
(3)可修改区别:指针与引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同的对象,但是引
用总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。