精华内容
下载资源
问答
  • php 变量引用与变量销毁机制 在php中,符号”&”表示引用。 1、看看不引用的情况是这样子: $a = “hello world”;//定义一个变量,下面赋值给$b $b = $a;//这一步没有在$a之前加符号&,像这样子”$b= & $a”。没有...
  • C++ 引用变量

    2017-07-10 16:38:49
    引用就是某一变量(目标)的一个别名,对引用的操作变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名;例如 int a = 10; int& b = a; 其中,b就是a的引用引用相当于别名,它们两个占...

    1.引用

    引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

    引用的声明方法:类型标识符 &引用名=目标变量名;例如

    	
    int a = 10;
    int& b = a;

    其中,b就是a的引用,引用相当于别名,它们两个占同一块空间,两个变量地址相同。

    引用的特点:

    1. 一个变量可取多个别名
    2. 引用必须初始化
    3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。

    2.const引用

    	int d1 = 4;
    	const int& d2 = d1;
    	d1 = 5;              // d1改变d2的值也会改变。
    	//d2 = 6;            //不能给常量(不能被修改的量)赋值const
    	
    	const int d3 = 1;
    	const int& d4 = d3;
    	//int&d5 = d3;
    	const int& d6= 5;    //常量具有常性,只有常引用可以引用常量
    	
    	double d7= 1.1;
    	//int& d8 = d7; //d7是double类型,d8是int,d7赋值给d8时要生成一个临时变量
    	//也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
    	const int& d9 = d7;

    3.引用做返回值和引用传参

    1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值


    void Swap(int a, int b)
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }

    这个函数采用的是值传递的方法,所以,它是否可以交换值。

    int main()
    {
    	int a = 3, b = 4;
    	Swap(a, b);
    	cout << a << endl << b << endl;
    }

    结果显示,并不能交换,因为函数参数是形参,形参是参数的一份临时拷贝,所以改变形参,实参不会有什么变化。

    2.【引用传递】如果形参为引用类型,则形参是实参的别名。

    void Swap(int& a, int& b)
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }

    这个函数采用的是引用传递,所以,它是否可以交换值。

    int main()
    {
    	int a = 3, b = 4;
    	Swap(a, b);
    	cout << a << endl << b << endl;
    }

    结果显示,可以交换,因为引用是变量的别名,所以,传引用,相当于传实参,所以可以交换。

    4.指针和引用

    1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
    2. 引用必须指向有效的变量,指针可以为空。
    3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
    4. 指针和引用自增(++)自减(--)意义不一样。
    5. 相对而言,引用比指针更安全。

    展开全文
  • C++变量引用

    2019-10-16 15:02:06
    引用的概念 变量引用就是变量的别名,&是“引用声明符”,假如有一个变量a,想给它起一...在声明一个变量引用之后,在本函数执行期间,该引用一直代表的变量相联系,不能再作为其他变量的别名。 引用的简...

    引用的概念

    变量的引用就是变量的别名,&是“引用声明符”,假如有一个变量a,想给它起一个别名b,则:

    int a;
    int &b=a;
    

    对变量声明一个引用,并不另开辟存储单元,b和a都代表同一变量单元。
    在声明一个引用的同时,必须同时使之初始化,即声明它代表哪一个变量。
    在声明一个变量的引用之后,在本函数执行期间,该引用一直与代表的变量相联系,不能再作为其他变量的别名

    引用的简单实用

    <例1>了解引用和变量的关系

    #include<iostream>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
    	int a = 10;
    	int& b = a;
    	a = a * a;
    	cout <<setw(5)<< a <<setw(5)<<b<<endl;
    
    	b = b / 5;
    	cout <<setw(5)<< b <<setw(5)<< a;
    	return 0;
    }
    

    运行结果
    可以看出因为引用并未开辟存储空间,所以引用的值与变量的值始终相等。

    关于引用的简单说明

    1. 引用并不是一种独立的数据类型,它必须与某一种类型的数据相联系,声明引用时,必须指定它代表的是哪个变量,即对它初始化。
    2. 引用与其代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。实际上,编译系统使引用和其代表的变量具有相同的地址。
    3. 当&a的前面有类型符时(如int &a),它必然是对引用的声明,如果前面没有类型符(如p=&a),此时的&是取地址运算符。
    4. 对引用的初始化可以用一个变量名,也可以用另一个引用。
    5. 引用在初始化后不能再被重新声明为另一个变量的别名。
    6. 实际上C++中很少使用独立变量的引用,如果要是用某一个变量,直接使用它的原名。

    将引用作为函数参数

    C++之所以增加”引用“,主要是利用他作为函数参数,以扩充函数传递数据的功能。

    C++调用函数时,有两种传递书的方式,一种是常用的方法:将实参的值传递给形参,称为传值方式调用;另一种是将实参的地址传递给引用型形参,称为引用方式调用

    <例1>无法实现两个变量的值互换的程序

    #include <iostream>
    #include<iomanip>
    using namespace std;
    
    void swap(int a,int b)
    {
       int temp;
       temp = a;
       a = b;
       b = temp;
    }
    
    int main()
    {
       int i = 3, j = 5;
       swap(i, j);
       cout << setw(5) << i << setw(5) << j << endl;
       return 0;
    }
    

    <例2>使用指针变量作形参,实现两个变量的值互换

    #include <iostream>
    #include<iomanip>
    using namespace std;
    
    void swap(int *a,int *b)
    {
       int temp;
       temp = *a;
       *a = *b;
       *b = temp;
    }
    
    int main()
    {
       int i = 3, j = 5;
       swap(&i, &j);
       cout << setw(5) << i << setw(5) << j << endl;
       return 0;
    }
    

    <例3>利用“引用形参”实现两个变量的值互换

    #include <iostream>
    #include<iomanip>
    using namespace std;
    
    void swap(int &a,int &b)
    {
       int temp;
       temp = a;
       a = b;
       b = temp;
    }
    
    int main()
    {
       int i = 3, j = 5;
       swap(i, j);
       cout << setw(5) << i << setw(5) << j << endl;
       return 0;
    }
    

    对引用的进一步说明

    1. 不能建立void型的引用
    void &a=9;
    
    1. 不能建立引用的数组
    char c[6]="hello";
    char &rc[6]=c;
    

    数组名c只代表数组首元素的地址,本身并不是一个占有存储空间的变量。

    1. 可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量。
    int a=3;
    int &b=a;
    int *p=&b;
    

    相当于

    int *p=&a;
    

    但是不能定义指向引用类型的指针变量

    int *p=& b;
    
    1. 可以建立指针变量的引用
    int i=5;
    int *p=&i;
    int * &pt=p;
    
    1. 可以用const对引用加以限制,不允许改变该引用的值
    int i=5;
    const int * &a=i;
    a=3;   //企图改变引用的值,错误
    
    //但是const并不阻止改变引用所代表的的变量的值
    i=3;  //合法
    

    这一特征在使用引用作为函数形参时是有用的,因为有时希望保护形参的值不被改变。

    1. 可以用常量或者表达式对引用进行初始化,但此时必须用const进行声明
    int i=5;
    const &a=i+3;
    

    用这种方法不仅可以用表达式对引用进行初始化,还可以用不同类型的变量对之初始化(要求能赋值兼容的类型

    double i=3.1415;
    const int &a=d;  //此时输出a的值将是3而不是3.1415
    

    如果在上面声明引用时不用const,则会发生错误。

    展开全文
  • c++引用与变量的关系

    2013-03-05 17:40:13
    引用其实是被引用变量的别名。一旦定义完成,引用就会与被引用的变量连在一起,成为好基友永远也不分开(地址一样)。但是这个引用智商不行,容易被骗,别的变量赋给他值他也接受,而且还会牵连原来的变量也改变值。...

    引用其实是被引用变量的别名。一旦定义完成,引用就会与被引用的变量连在一起,成为好基友永远也不分开(地址一样)。但是这个引用智商不行,容易被骗,别的变量赋给他值他也接受,而且还会牵连原来的变量也改变值。

    <span style="font-size:18px;">#include "stdafx.h"
    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a=999;
    	int &ra=a;
    	cout<<"&a"<<&a<<endl;
    	cout<<"&ra"<<&ra<<endl;
    	int b=888;
    	ra=b;
    	cout<<"&a"<<&a<<endl;
    	cout<<"&ra"<<&ra<<endl;
    	cout<<"a"<<a<<endl;
    	cout<<"ra"<<ra<<endl;
    	cout<<"b"<<b<<endl;
    	system("pause");
    	return 0;
    }</span>

    运行结果如下:

    &a001CF980
    &ra001CF980
    &a001CF980
    &ra001CF980
    a888
    ra888
    b888
    请按任意键继续. . .

    展开全文
  • 在php中,符号"&"表示引用。...没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了   ps:在php中,使用"="直接赋值,其实就是拷贝一份右边的变量给b,会生

    在php中,符号"&"表示引用。

    1、看看不引用的情况是这样子:

    $a  = "hello world";//定义一个变量,下面赋值给$b

    $b = $a;//这一步没有在$a之前加符号&,像这样子"$b= & $a"。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了

     

    ps:在php中,使用"="直接赋值,其实就是拷贝一份右边的变量给b,会生成一份内存空间,结果可能是同样的内容在内存中两份。在有些关于php性能方面提到,这样子会多占有内存空间。不过我接触中,大部分人没怎么注意,其实一般应用这样子用产生的显著差异并不明显。不会看到什么效果,其实我本人也没经常使用&进行引用,呵呵。只是我觉得,深入了解里面的实现原理,非常有必要。我喜欢关注原理性的东西。

     

    2、使用符号&进行引用

    $a  = "hello world";

    $b = &  $a;

    使用引用,php引擎不会拷贝一份变量,其实就是将指针指向了$a在内存中的地址,$b中就是保存了这个指针。

     

    所以使用引用的时候,把$b的值改变,$a也会跟着改变

     

    比如:

    $a  = "hello world";

    $b = &  $a;

    $b = "test new value";//把b的值改掉,a的值也会跟着改变

     

    echo $a;//输出test new value,因为改变了b的值也会改变a的值。

     =====================================

    经常在定义函数的时候看到像这样的情况:

     

    function test (& $param)

    {

    //函数定义的内容

    $param++;
    }

    解释:$param前面带有引用,所以传入进来的参数并不会在内存中拷贝一份,而是直接对原来的内存空间进行引用。所以:如果里对使用符号&传入进来的变量值进行修改了,那么也会改变原来的内存空间中的值。

     

    做个测验如下:

    $k = 8;
    test($k);
    echo $k;//结果$k的值被函数里面改变了,输出9。

     

    还会经常看到这样子调用函数:

     

    $return  = & test_func();

    前面了解到php引擎的机制是:=会把右边的内容拷贝一份给予左边的变量。所以使用&就是将函数的结果不会进行拷贝一份,实际上我的理解是把指针给了左边的变量。

    什么是指针,以前学c语言中的概念。我的理解是就是:指针,指针,指向针(指南针,呵呵)。把指针看成是一个内存的地址容易理解点,计算机就知道去内存什么位置找数据了吧。这是浅显的理解,深入的我不会,呵呵。

     

    总结:使用引用是为了减少内存资源的占用。

     

    php手册中对引用的解释如下:

    在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。


     

    3、销毁变量的时候。并不会改变原来的值。

    试验:$b = & $a;

    既然改变$b的值,$a的值也跟着改变,假如把$b销毁掉(内存中不占用空间了,不是null,也不是值为""),$a的值是不是也会跟着被删掉呢?

    其实国外有本php方面的书中专门提到了这个机制。2年前看的。不是很记得了。原则是就是删除变量的时候,会自动拷贝。

    其实这样子,就是为了避免把$b给删掉,造成把$a也给删掉的问题。


    <?php
    //只有等到销毁的时候就会自动拷贝一份。php不会把被引用的变量销毁掉。
    $a = 'd';

    $b = & $a;
    $b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
    var_dump($b,$a);


    unset($b);//调用unset删除b变量,a变量不会删除

    var_dump($b,$a);//输出null和8

     

    调用unset删除$b变量的时候,php引擎从变量符号表中发现:我要删除的变量$b原来是引用了变量$a,这不好删除啊,因为一删除导致$a变量也没了,所以就先把$a变量拷贝一份后在删除$b变量。

    关于php符号表:其实我的理解是,运行中所有变量名称都记录在里面,php来维护,具体的数据当然是存储在内存中,php就是根据这个符号表去回收没有用到的变量空间的,释放内存空间)。去看看php的垃圾回收机制(释放不再使用的内存空间),就是根据符号表进行的。
    展开全文
  • 我的结论:引用不占用内存空间。 C++Primer(5版)一书中指出: 定义引用时,程序把引用和它的初始值绑定(bind...而且在实际编译运行操作中,打印引用的地址结果与变量的地址一样,故我认为引用并不占用内存空间。 ...
  • 引用类型变量的赋值

    2019-10-01 16:16:59
    引用类型变量的相互赋值 代码: 1 Myclass obj1=new Myclass(){Valie=100};2 Mycalss obj2=null;3 obj2=obj1;//引用类型变量的赋值4 Console。WriteLine("obj1.Vlaue="+obj2.Value);5 //输出:obj2.Value=100 ...
  • 如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器在下面两种情况下生成临时变量:  实参类型是正确的,但不是左值  实参类型不正确,但可以转换为正确的类型   Double refcube...
  • 1.数组元素作为函数实参 2.数组名作为函数实参 3.用多维数组名作为函数实参 int a[10];//相当于定义10个变量 a[0]-a[9] ...//实参变量对形参变量的数据传递是值传递(形参是分配内存的),单向传递。只有实参传...
  • 在声明成员变量时,用关键字static给予修饰的称作类变量,否则成为实例变量(类变量也称为static变量、静态变量),例如: class Person { int x; //实例变量 static int y; //类变量 } 上述Person类...
  • 首先看下面的代码: ...  public class Test ... public static void main(String[] args) { ... 原因:当代码执行到标记1... 当代码执行到标记4的时候,由于两个变量引用同一个数组对象所以结果为array1[1]=100。
  • // JS变量包含两种不同的数据类型的值:基本类型值和引用类型值; // 1.基本类型值:保存在栈内存中的简单数据段;即这种值完全保存在内存中的一个位置; // 基本类型值包含:Undefined|Null|Boolean|Number|String; // ...
  • 正如《C++ primer》中所述,“引用即别名,它并非对象,相反地,它只是一...以下是一段对引用和源变量取地址的代码,一起看一下 #include<iostream> using namespace std; int main() { int a = 10; int &
  • python变量与内存

    2020-05-04 14:14:05
    探讨python变量与内存 首先声明本文所有测试结果由vs2019 community版,python版本3.8实现, 小白多方参考,新手司机上路,考虑到不同解释器可能做出的优化或py版本相异的原因造成的结果不同,请以自身结果为准。...
  • PHP 变量与常量

    2015-12-09 23:44:07
    对于变量与常量这种老生常谈的话题,也许觉得作者本人太过于啰嗦。但我发现再次去理解或者是再次去阅读相关内容时,总能给人一种更新的感受,而且这种感受更加深刻。我想这就是所谓的:温故而知新吧。好了不再多说了...
  • C语言中局部变量与全局变量在内存中的存放位置
  • Delete(BSTree p)”这个函数来删除结点*p(注:BSTree是BSTNode*指针变量),但是每次都是提示内存溢出的问题,弄的好郁闷,后来仔细想了想,好像想出来了一些东西。 先说一下上面说的这个函数,如果我们传递过来...
  • 这里不讲垃圾回收的机制 ...我们都知道变量占有内存,内存在底层分配上有堆和栈。 值类型变量的内存通常是在栈中分配 引用类型变量的内存通常在堆中分配 注意这里说的是通常,因为变量又分为局部变量和全局变量。 当变
  • 类的成员变量有两种:一种是static关键字修饰的变量,叫类变量或静态变量,一种是没有static修饰的,叫做实例变量   静态变量和实例变量的区别在于:   类静态变量在内存中只有一个,java虚拟机在加载类的...
  • 指针变量与内存分配

    千次阅读 2015-02-11 19:30:05
    指针变量与内存分配 1. char * str1; //str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存 中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中): str1=(char *)malloc...
  • 声明外部变量)告诉编译器变量名字类型; 变量的定义:为变量分配存储空间,此时也可以给定初始值; 函数的声明:告诉编译器有这么一个函数; 函数的定义:实现函数,简言之就是带有{ }; 结构体一样,类...
  • 变量的作用域是指变量的作用范围,即变量再程序中可以访问的区域。 c语言中,每个变量都有一个有效的作用域。比如再函数内部定义的变量,不能再其他函数中引用 局部变量 指再函数体定义的变量和函数的形参。函数...
  • 基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按值来访问的。 (1)值类型:数值、布尔值、null、undefined。 (2)引用类型...
  • 变量存储类型

    2017-04-20 11:12:00
    变量的存储类型 - 静态存储方式 - 动态存储方式 1.静态局部变量 用关键字static定义的局部变量是静态局部变量,它放置在内存中的...只有程序结束并再次运行程序时,静态局部百年来那个才重新赋初始值。 2.
  • js 变量声明定义

    千次阅读 2017-02-21 18:28:14
    你好,js语言是弱类型语言,无需申明即可直接使用,默认是作为全局变量使用的。 建议: 在function里时应使用var 申明变量,这样改变量仅仅只在function的生存周期内存在,不会污染到,全局控件。至于直接在标签...
  • 2.内存问题JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则...
  • XSLT 参数与变量

    千次阅读 2017-01-23 09:39:15
    出处:微软文档 在理想情况下,XSLT 筛选器是一个“黑匣子” - 这个筛选器将获取一个或...这些 XSLT 元素在声明环境中(数据在这里流入,转换,然后流出)的一些作用函数参数在程序环境中(在这里,日常代码占
  •   JavaScript 的变量与其他语言的变量有很大区别。JavaScript 变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,...
  • 信号量也是一种用于线程间互斥的进入临界区的特殊变量,不过信号量可以等于多个数值,可以通过数值表示临界资源的个数(累计唤醒次数),比如某个信号量mutex1=7可以用于表示缓冲区中有7个资源可以消费者消费。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,705
精华内容 13,882
关键字:

引用变量与被引用变量占有