首页 >> 手游攻略

up值是什么 arup值是什么

大家好,up值是什么相信很多的网友都不是很明白,包括arup值是什么也是一样,不过没有关系,接下来就来为大家分享关于up值是什么和arup值是什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

很多语言在传参的时候都有一个传值和传地址(或者是引用)的问题,我想用C++语言来简单的描述一下。因为我觉得无论是传值还是传址,C或者C++这两种语言都是能够比较直观的描述清楚的语言,原因是可以容易的去观察内存。其他语言也可能可以,只是其他语言的我不太知道如何去做。

传递两个int型参数

先来看第一段程序,代码如下:

voidswap(inta,intb)n{ncout<<"a="<<a<<"b="<<b<<endl;nninttmp=a;na=b;nb=tmp;nncout<<"a="<<a<<"b="<<b<<endl;n}nnintmain()n{nintx=1,y=2;nncout<<"x="<<x<<"y="<<y<<endl;nnswap(x,y);nncout<<"x="<<x<<"y="<<y<<endl;nnreturn0;n}

代码比较简短,是一个交换函数。在main函数中定义了两个变量,分别是x和y,其值分别为1和2,然后调用swap函数,swap函数当中是典型的交换两个值的一段代码。然后main函数中,调用swap函数前后都会输出x和y的两个值,然后观察一下它们的输出。

从图中,第一行和最后一行是main函数输出的结果,第二行和第三行是swap函数输出的结果。图中可以看出,在swap函数中,两个变量的值交换了,而在main函数中值是没有被交换的。

我们在调用swap(x,y)的位置处,设置一个断点,然后查看一下变量x和变量y的地址,如下图。

从图中可以看到,x的地址是0x0019fefc,y的地址是0x0019fef0,记住这两个地址,然后去swap函数中查看变量a和变量b的地址,如下图。

从图中可以看到,a的地址是0x0019fe18,b的地址是0x19fe1c。

注意看上面两张图,两个地址下面都是保存的实际的值。

这就说明,形参a、形参b和实参x、实参y根本不是一个地址。因为在函数调用时,形参只是一个副本,只是把值的内容由实参拷贝给了形参。而形参进行值交换以后,实参是不会受影响的。

如果想要在swap中改变两个变量的值,并影响main函数中的两个实参,其实是可以的。但是这里不演示,我们通过后面的内容继续说。

传递一个对象

再来看第二段代码,代码如下:

classPointn{npublic:nintx;ninty;n};nnnvoidswap(Pointpt)n{ncout<<"pt.x"<<pt.x<<"pt.y"<<pt.y<<endl;nnninttmp=pt.x;npt.x=pt.y;npt.y=tmp;nnncout<<"pt.x"<<pt.x<<"pt.y"<<pt.y<<endl;n}nnnintmain()n{nPointpt;npt.x=1;npt.y=2;nnncout<<"pt.x"<<pt.x<<"pt.y"<<pt.y<<endl;nswap(pt);ncout<<"pt.x"<<pt.x<<"pt.y"<<pt.y<<endl;nnnreturn0;n}

第二段代码,我这里定义了一个类,类中由两个成员变量,然后仍然通过swap方法来交换两个成员变量的值,swap函数的形参是Point类型,输出结果如下图。

可以看到,第一行和第四行是main函数的输出,第二行和第三行是swap函数的输出。同样,swap函数的交换没有影响到main函数。继续看一下它们的地址,先来看main函数中pt变量的地址,如下图。

可以看到,pt变量的地址是0x0019fef8,记住这个地址,然后看swap中形参pt变量的地址,如下图。

可以看到,在swap中形参pt的地址是0x0019fe20。

注意看上面两张图,对象地址下面都是保存的是成员变量的值。

可以看到,实参和形参的地址同样不是相同的地址。同样,调用函数的时候,把main函数中的pt对象的值拷贝了一份给swap函数的形参pt,还是一个值拷贝的过程。因此在swap中交换还是没有影响main函数中的值。

传递一个对象的指针

再看第三段代码,代码如下。

classPointn{npublic:nintx;ninty;n};nnnvoidswap(Point*pt)n{ncout<<"pt->x="<<pt->x<<"pt->y="<<pt->y<<endl;nnninttmp=pt->x;npt->x=pt->y;npt->y=tmp;nnncout<<"pt->x="<<pt->x<<"pt->y="<<pt->y<<endl;n}nnnintmain()n{nPoint*pt=newPoint();nnnpt->x=10;npt->y=20;nnncout<<"pt->x="<<pt->x<<"pt->y="<<pt->y<<endl;nswap(pt);ncout<<"pt->x="<<pt->x<<"pt->y="<<pt->y<<endl;nnnreturn0;n}

这段代码就稍有不同,这段代码中出现了指针,而且Point的对象pt是通过new实例化出来的。看一下输出结果。

可以看出,swap函数中的交换影响了main函数中的值。同样的,在main函数中下断点,看pt对象的地址。

这次注意一下这次图中和上面图中的变化,这次的pt的地址是0x0019fefc,但是它的下面是一个地址,而不是成员变量的值了,而这个地址是0x004ae718,在这个地址下面是成员变量X和y的值。

然后,我们去swap中,看一下它形参的情况,如下图。

可以看到,形参pt的地址是0x0019fe18,和main函数中的地址还是不同,但是注意下面值,还是一个地址,而这个地址和main函数中的地址是一样的,也是0x004ae718,这个地址下面,就是成员变量x和y的值了。

这样在swap函数中进行交换以后,就影响了main函数中的值。

注意:

1、这里实参和形参保存了相同的堆地址,但是实参和形参的地址是不一样的,实参在栈中的地址是0x0019fefc,形参在栈中的地址是0x0019fe18。

2、栈地址的由0x0019开头的,而堆地址是由0x004a开头的,两块内存的跨度很大。

3、如果你在你的机器上进行调试的时候,你的栈地址、堆地址跟我可能会不一样,因为这些地址受操作系统版本号、补丁号、编译器版本、甚至编译器参数的影响。

传递对象和对象指针的内存示意图

画个图说明一下。

先来画一下第二段代码的内存示意图,如下图。

在内存中大体有几个部分,分别是代码区、栈区、堆区、全局数据区、只读数据区……对于main函数,在栈中有它对应的一块栈帧,当main函数调用swap函数时,CPU会给swap开辟一块栈帧。(注意:栈的维护是由CPU的两个寄存器管理的,在64位CPU下分别是RBP和RSP两个寄存器来维护的,且栈地址的方向是由高地址向低地址延申的。这个栈不是JVM的栈)然后,main函数会把pt中的内容拷贝一个副本给swap的形参pt,因为形参pt的数据在自己的栈帧中,因此,它的值交换是不会影响到main函数对应的栈帧中的。

再来画一下第三段代码的内存示意图,如下图。

第三段代码中的pt是一个Point*类型,就是一个指针。然后Point的实例化是由new进行的,使用new实例化的对象在堆中,new完成以后会把在堆中开辟的内存空间的首地址赋值给pt变量,也就是说pt中保存的是Point实例在堆空间中的首地址。

当main函数调用swap的时候,传递的同样是自身的一个副本,不过这个副本是Point实例在堆空间的首地址,那么swap的形参pt中也保存了Point实例在堆空间的首地址。此时,实参pt和形参pt都指向了同一块内存,那么当swap中交换两个成员变量的后,当然会影响main中实参两个成员变量的值。

传递int型指针

对于,第一段代码来说,如果想要在swap中的交换影响main中的值,可以把实参的地址传递给swap的形参,代码如下。

voidswap(int*a,int*b)n{ncout<<"*a"<<*a<<"*b"<<*b<<endl;nnninttmp=*a;n*a=*b;n*b=tmp;nnncout<<"*a"<<*a<<"*b"<<*b<<endl;n}nnnintmain()n{nintx=1,y=2;nnncout<<"x"<<x<<"y"<<y<<endl;nnnswap(&x,&y);nnncout<<"x"<<x<<"y"<<y<<endl;nnnreturn0;n}

输出图下图所示。

对于第一段和第二段代码在C++中称为传值,对于第三段和第四段代码在C++中称为传地址。地址和值在内存中本身都是一个值,只是具体分类是做了区别而已。

Java传参

Java中说的传参全部是传值,但是当形参是一个对象的时候,其实相当于传的是一个地址。因为变量中本身就保存的是一个地址,而不是一个值。具体方式和C++的是类似的(和第三段代码类)。Java的对象是new出来的,也在堆空间中,而new赋值的那个变量是在栈中,栈中同样保存的是堆空间的首地址。传参时,也是把堆空间的地址传给了形参。Java的堆和栈,是由JVM管理和维护。

#在头条看见彼此#u0002#头条创作挑战赛#u0002

关于up值是什么到此分享完毕,希望能帮助到您。



本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“up值是什么 arup值是什么

标签:
t恤英文?t恤英文怎么说
« 上一篇 2023-10-12