指针和引用是否分配存储单元的简易理解
来源:互联网 发布:linux dd命令详解 编辑:程序博客网 时间:2024/05/22 06:40
一下都是网上的主要摘要,记录如下:
提问:
都说引用不占存储空间,可是这句话我不太理解,下面是我的一个测试例子:
int ia =1;
int &ib = ia ;
int ic = 2 ;
printf("%p\n",&ia) ;
printf("%p\n",&ib) ;
printf("%p\n",&ic) ;
可是输出的是:
0012FF64
0012FF64
0012FF5C
也就是ia和ic之间隔了8个字节,这不说明引用ib也占了内存空间吗??如果不占内存空间,ia,ic之间不是应该只隔4字节的吗?
请高人指点~
结论:
c++没有规定引用的底层实现,所以编译器实现时,可以为引用分配空间,也可以不分配空间~~~不过大数多编译器用指针来实现。但并不代表会为它分配空间。
以下面程序为例:
int
ia =1;
int
*ib = &ia ;
//ib由引用变成指针
int
ic = 2 ;
printf
(
"%p\n"
,&ia) ;
printf
(
"%p\n"
,ib) ;
//引用取地址=>指针本身就是地址
printf
(
"%p\n"
,&ic) ;
这里为ib分配了一个空间,但由ib这个指针很特殊,在定义的时候一定要有初始化,这就为它的优化提供了很好的依据。也就是说,引用和指针一样占4个字节(和int一样) ,引用其实就是加了一些限制的指针,这里为他分配了ib变量分配了4字节。
上面的代码完全可以变成下面这样:
int
ia =1;
//int &ib = ia ; 编译只需记住ib是ia的引用,不需要分配空间
int
ic = 2 ;
printf
(
"%p\n"
,&ia) ;
printf
(
"%p\n"
,&ia) ;
//原来是printf("%p\n",&ib) ;ib即ia(引用定义),故直接用ia来替换
printf
(
"%p\n"
,&ic) ;
最后这个代码就没有为引用分配空间…… 如果标准没有规定这些行为,不同的编译器会有不同的行为。
以下是我对 “引用和指针传递函数的参数” 个人的理解,以下面程序为例:
int i = 5;
int *k = &i;
int &x = i;
printf("%p\n",&k);
testA(k);
printf("%p\n",&x);
testB(x);
void testA(int* p)
{
printf("%p\n",&p);
}
void testB(int& p)
{
printf("%p\n",&p);
}
输出如下:
0x001ef4bc
0x001ef3d8
0x001ef4c8
0x001ef4c8
说明了函数处理引用和指针实参上的不同,引用只是一个别名,并不会对引用形参重新分配内存单元,而只会对指针形参重新分配内存单元,产生了一份指针的副本
- 指针和引用是否分配存储单元的简易理解
- 引用和指针的区别个人理解
- 对指针和引用的理解
- 深入理解C++的指针和引用
- C语言指针的内存分配和Java中的引用
- 结构体的自引用和存储分配
- 指针和引用对比 理解引用起到别名的作用
- 指针的引用理解和复杂声明的理解
- 结构的存储分配(c和指针.P206.)
- 申请n个连续字符存储单元,释放已分配的存储单元
- 再次理解指针和引用
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 理解指向指针的引用
- 理解指向指针的引用
- 理解指向指针的引用
- C++指针的引用理解
- Class.forName和ClassLoader.loadClass区别
- APT攻击检测-韩志立
- 移动产品设计随记(一)
- 被忽视的TWaver功能(1)
- 实战parse_ini_file()及扩展函数解析ini文件完整版
- 指针和引用是否分配存储单元的简易理解
- Android如何关闭Application
- Delphi三层开发小技巧:TClientDataSet的Delta妙用
- 用GDB调试多进程程序
- (c/c++学习笔记五)数组和指针
- vb实现目录下所有文件/目录名称的获取
- 【翻译】(66)uses-feature元素
- Spring定时器中关于方法传参的问题
- 【操作系统-Windows】无线网络部可用