内存地址(内存地址是什么)

更新时间:2023-03-01 17:45:33 阅读: 评论:0

1 内存单元的地址、值属性

程序的代码和数据要存储到内存才可以被执行。内存单元同时具有地址属性和值属性。

地址属性:每一个字节(8个位)都有一个内存地址对应,变量名就是对地址的命名,让其更好理解、记忆和使用;

值属性:一串的0、1二进制,按数据类型确定其长度和解码方案;

2 普通、指针、引用变量对地址、值属性的显式、隐式使用

普通、指针、引用变量的区别在于对地址、值属性的显式、隐式使用的方式不同:

3 引用的本质是一个实现的自动解引用指针常量

引用可以理解为其引用的变量的别名,但本质是一个实现的自动解引用指针常量。

在函数定义中,引用在形参在声明时,显式使用地址属性,类似指针变量的使用。在函数体中,显式使用变量(别名)的值属性,类似于普通变量,因为由编译器实现了自动解引用。

引用的常量属性,必须在声明时初始化(也就再没有机会做其它变量的别名或引用了),也因为其具有自动解引用的属性,声明(包括初始化)以外的使用都是显式对应其指向的地址的值的引用(相当于直接使用其引用(或指向)的普通变量)。

因为这些属性,相对于指针,引用更安全,使用更简洁。当然,引用不能替代指针,指针有自己的使用场合,特别是当其不断需要变更指向时。

#include <iostream>using namespace std;void swap(int& a,int&b){ int t; t=a; a=b; b=t;}void main(){ int i=3; int j=5; swap(i,j); cout<<i<<","<<j<<endl; system("pau");}

引用占用内存空间吗?

看下面的小实例:

#include <iostream>using namespace std;void main(){ int j=3; int var=4; int* p = &var; int& f = var; int i = 5; cout<<&j<<endl; cout<<&var<<endl; cout<<&p<<endl; cout<<&f<<endl; cout<<&i<<endl; system("pau");}/*0012FF440012FF400012FF3C0012FF400012FF34/*

上面定义了上述各种类型的变量,因为都是局部变量,被分配在栈空间,因为定义在一起,其地址也应该是紧邻在一起的,上面的int& f = var; 引用变量f也是夹在中间,如果不占用空间的话,其前面与后面变量的地址所相关的数量应该是前面变量类型的长度,

int* p = &var; int& f = var; int i = 5;

32位计算机中,p的长度是4,地址是0012FF3C,0012FF3C-4=0012FF38,但i的地址是0012FF34。所以,其实质是占用了一个指针长度的内存空间,但用求址运算符"&“求出的却是其别名的地址,其本身的地址是隐藏的。

4 函数的值传递、指针传递、引用传递

程序的数据始终需要在共享与相对独立、内聚与耦合之间取舍。类的封装与访问属性的控制以及友元的语法机制就是如此,函数也是面向过程的封装,函数之间可以相互调用,其数据的共享与相对的独立性的取舍就用了值传递、指针传递、引用传递的语法机制。

值传递是为了实现函数之间的相互独立性,被调用函数对调用函数来说,我是值传递,我只用你的变量的值(实参),由编译器在栈内帮我找一块内存单元(用形参命名,如果是自定义类型,可能需要一大片内存空间),你只要把变量的值传递进去,此后,实参与形参对应各自的栈空间,彼此不相关,相互独立。独立是独立了,但赋值是需要时间的,是有性能损耗的,另外,另外的空间也是一种浪费。

指针传递破坏了上述的独立性,但实现了数据的共享,有了时间和空间上更高的效率,让参数有了输出的功能。被调用函数对调用函数来说,我是指针传递,编译器不会再在栈内开辟内存空间来存储你的变量(实参)的值了(只需用一个字长的空间来保存一个地址值),我们共享、共同使用你的用做实参的变量的空间,这样没有时间和空间的浪费。

引用传递和指针传递都是址传递,都是数据共享,只是引用相对来说,在特殊的场合下,如上面所说的,更安全(因为其地址属性的使用只有一次的机会)、更简洁(定义后无须解引用即使用其引用的变量(别名)的值,不然为什么叫引用呢?)。

函数可以返回值,也可以返回地址,返回值与传递值也有一个相同的地方,也是另行使用一个栈上的内存空间,建立一个临时对象保存这个值(如果是自定义类型,可能需要一大片内存空间)。返回地址也是只保存了一个地址值。需要注意的是,不要返回局部变量的地址值,因为出了这个被调用函数,其局部变量的地址值已不可见了。

需要注意的是,实参与形参的结合以及函数返回,会有隐式类型转换的问题。

-End-

本文发布于:2023-02-28 20:13:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/167766393282080.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:内存地址(内存地址是什么).doc

本文 PDF 下载地址:内存地址(内存地址是什么).pdf

标签:内存   地址
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|