栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

指针、变量

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

指针、变量

变量

为了说明这个问题,咱们简单的来说一下C里面变量在内存里面的存储:

  1. 栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。调用完就释放空间。(Linux平台的是8MB,如果超过这个限制,就会出现 stackoverflow)
  2. 堆区(heap) — 一般由程序员分配释放, 用来存储数组,结构体,对象等。若程序员不释放,程序结束时可能由OS回收。(堆内存并无限制,内存有多大就可以申请多大)
  3. 全局区(静态区)(static)— 存放全局变量、静态数据、常量。程序结束后由系统释放。
  4. 文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。
  5. 程序代码区 — 存放函数体(类成员函数和全局函数)的二进制代码。

 上面提到的都是变量的值存储的位置,那变量名存在哪里呢。C语言执行需要经过预处理(Preprocessing)、编译(Compilation)、汇编(Assemble)、链接(Linking)这四个阶段。我们使用gcc分步执行执行到编译阶段查看汇编代码。

 没有找到a和b吧,所有的变量名到最后都变成了地址,汇编指令操作的是各种寄存器和内存地址。

定义int a;时,编译器分配4个字节内存,并命名该4个字节的空间名字为a(即变量名),当用到变量名a时,就是在使用那4个字节的内存空间。 5是一个常数,在程序编译时存放在代码的常量区存放着它的值(就是5),当执行a=5时,程序将5这个常量拷贝到a所在的4个字节空间中,就完成了赋值操作.a是我们对那个整形变量的4个字节取的"名字",是我们人为给的,实际上计算机并不存储a这个名字,只是我们编程时给那4个字节内存取个名字好用。实际上程序在编译时,所有的a都转换为了那个地址空间了,编译成机器代码后,没有a这个说法了。a这个名字只存在于我们编写的代码中.5不是被随机分配的,而总是位于程序的数据段中,可能在不同的机器上在数据段中的位置可能不一致,它的地址其实不能以我们常用到的内存地址来理解,因为牵扯到一个叫"计算机寻址方式"的问题。

以上内容来自C语言里面变量和变量名的存储(转) - 朱果果 - 博客园 (cnblogs.com)

下面我们来说指针

通过上面的了解,我们可以理解为a代表了一段内存空间(a不是指向一个内存空间,编译完就没有a了,它本身就是代表了一个内存空间)。当我们输入a=5的时候,实际上是把a空间填充5。当我们使用a时,比如b = a,实际上是表示的把a里面的内容拷贝到b内存空间,时此时我们定义一个指针。

int a = 1;

int *p;

p = &a;

同样的,p作为一个指针变量,它也是变量,编译完之后也代表的是一个内存空间。当使用p = &a时表示的是把a空间的地址放到p代表的内存空间中。

使用*p解引用,p的内容是一个地址,*p表示找这个地址中的内容。*p可以做左值也可以做右值。做左值比如*p = 4;表示p空间存的地址指向的空间的内容(即a)改为4,b = *p表示把p空间存的地址指向的空间的内容拷贝给b的空间。

二级指针

int a = 1;

int *p;

int **pp;

p = &a;

pp = &p

 *pp表示的就是pp中存的地址指向空间(即p的空间),**pp就相当于*p(因为*pp = p),即a的空间

 来看个复杂的

int **pp2;

int *p1;

int n =13;

pp2 = &p1;

*pp2 = &n;

*p1 = 10;

求n的值。

 pp2 = &p1是把p1的地址给了pp2,*pp2实际上指的就是p1。*pp2 = &n其实就是p1 = &n,把n的地址给了p1。*p1 = 10 ,就是n = 10。

 总结:指针和普通变量的区别


1)寻址方式不同:
普通变量采用直接寻址方式,只需要一次就可以从内存中取出需要的数据。而指针变量是间接寻址方式,且至少进行两次。值得注意的是,理论上,一维指针变量寻址两次,二维指针变量寻址三次…n维指针变量寻址n+1次,且n可以无限增加,但是实际上,不同的寻址方式比如两次寻址和三次寻址,是在设计之初就被编进指令集中的,指令码的限制使得大多数寻址控制在两到三次,也就是我们说的一维指针和二维指针,与其可类比的概念的有一维数组和二维数组,但它们又不完全相同,后续会接着说到。
2)存储空间不同:
指针变量因为采用指针指向内存地址取值的方式,额外增加了1个指针地址的存储空间
3)操作方式不同 :
对于普通变量,只允许修改它的内容;对于指针,可以修改指针变量的指向地址和该地址的内容。


引用:(40条消息) C语言——指针篇(一)指针变量和普通变量的区别_陆小白很白的博客-CSDN博客_指针变量和普通变量的区别

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号