C++面试题四---指针和引用的关系

指针和引用的关系

https://blog.csdn.net/qq_27678917/article/details/70224813
指针和引用的关系:引用是变量的别名,可以将引用看做是操作受限的指针
1、 性质上的区别:
a、指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已(占用同一个存储单元)。
b、引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。
c、指针可以有const指针,但是没有const引用
d、指针可以有多级,但是引用只能有一级
e、指针的值可以为空,但是引用的值不能为NULL,并且引用在定义时必须初始化
f、指针的值在初始化以后可以改变,指向其他的存储单元,而引用在初始化后就不能更改
g、sizeof“引用”得到的是所指向的变量的大小,sizeof”指针”得到的是指针本身的大小(如果是int *p,则sizeof p 32位中得到是4)
h、指针和引用的自增运算不一样(指针的自增1是其指向的地址增加一个对象类型大小,指向下一个内存地址;引用的自增是对引用值的自增)
i、如果返回动态内存分配的对象或者内存,必须使用指针,使用引用可能引起内存泄漏
2、 作为函数参数进行传递时的区别
使用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的,当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参。
在将引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。

C++程序的内存分区

https://blog.csdn.net/qq_22080999/article/details/81022508
1、 分区
在C++中,内存分为5个区:堆区、栈区、全局区(静态区)、文字常量区、程序代码区
栈区stack:由编译器自动分配和释放,存放函数的参数值、局部变量的值等、其操作类似于数据结构中的栈。
堆区heap:一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。它与数据结构中的堆是两回事,分配方式倒是类似于链表。(malloc/free,new/delete)
全局区(静态区)static:全局变量和静态变量的存储时放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
文字常量区:常量字符串放在这里。程序结束后由系统释放。
程序代码区:存放函数体的二进制代码。

int a = 0;//全局初始化区
char *p1;//全局未初始化区
main()
{
    int b;//栈
    char s[] = "abc";//栈
    char *p2;//栈
    char *p3 = "123456";//123456在常量区,p3在栈上
    static int c = 0;//全局(静态)初始化区
    p1 = (char*)malloc(10);
    p2 = (char*)malloc(20);//分配的10字节和20字节的区域在堆区
    strcpy(p1, "123456");//123456放在常量区,编译器可能把它和p3指向的123456优化成一个地方
}

2、 堆和栈的区别
1) 堆和栈中的存储内容:栈存局部变量、函数参数等。堆存储使用new、malloc申请的变量等;
2) 申请方式:栈由系统自动分配;堆需要程序员自己申请,并指明大小,用malloc或new
3) 申请后系统的响应:栈:只要栈的剩余空间大于所申请,系统将为程序提供内存,否则将报异常提示栈溢出;
堆:当系统收到程序的申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。系统会自动地将多余的那部分重新放入空闲链表中。
4) 申请大小的限制:
栈:在Windows下,栈的大小是2MB(编译时就确定的常数),如果申请的空间超过栈的剩余空间,将提示overflow。
堆:堆是是不连续的内存区域。获得的空间较灵活,也较大。
5) 申请效率比较:
栈:由系统自动分配,速度较快。但程序员无法控制
堆:是由new分配的内存,一般较慢,容易产生内存碎片,但用起来方便
总结:栈区优势在于处理效率,堆区优势在于灵活
3、 内存模型
C++中的内存模型有:自由区、静态区、动态区;
根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。
自由存储区:局部非静态变量的存储区域,即平常所说的栈;
动态区: 用new ,malloc分配的内存,即平常所说的堆;
静态区:全局变量,静态变量,字符串常量存在的位置;
注:代码虽然占内存,但不属于c/c++内存模型的一部分;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值