`
wenzongliang
  • 浏览: 448732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c++ 指针与引用(别名)的区别,c++引用与java引用区别

 
阅读更多

c++ 指针p是一个独立的变量,存的别的变量a的地址(有两个存储空间,p 和a)

c++引用(别名)b是另个一个变量a的别名,是同一个变量。(只有一个存储空间b a表示同一个空间)

 

java 引用就是c++的指针,只是不能++,--。

 

最近写一个Java String函数的时候遇到引用原理上的一些问题,当时很急,没有仔细思考,最后通过返回值回避了引用的使用。

今天早上上班的路上,突然就想起了当时使用python的时候,同样存在的引用问题,和c++对比后,发现其实问题并没有那么简单。

在《java编程思想》里有对javac++引用的区别的介绍,现在想起来,书的中文翻译对这段的解释并不专业,没有把问题的本质讲清楚。

 

java的引用和python很像,但无论是原理上,还是使用上,都完全不同于c++的引用。

Java中的引用在使用上非常类似于c++的指针,相当于通过一个变量存储实际对象的地址,如下例:

A a = new A(1);

A b = a;

 

 

如上图,ab作为A(1)的引用,相当于c++中的指针,它们都存储了A(1)的地址。在函数调用时

fun(A x)

{

   

}

 

当我们调用fun(a)时,实际上相当于执行了 x = a;

也就是说,现在

 

 

 

 

我们知道java里函数是按值传递的,fun调用时把a的值(A(1)的地址)传递给了x。如果我们通过x更改了A(1),那么所有指向A(1)的引用在使用新的A(1)时都会收到影响,但是,如果在

fun(A x)

{

         x = new A(3);

}

x 被重新赋值,那么对ab以及它原来指向的A(1)没有任何影响。

 

下面来说c++里的引用,在c++里面,使用引用这个词其实并不恰当,因为c++里的引用其实是一个变量的别名,也就是说

A a = A();

A& b = a;

这个时候b就是a,只不过换了一个名字而已,b是依托于a而存在的,换句话说,一个人有名字,同时起了一个别名,但是有别名的前提是他必须要有名字,因此,c++不存在空引用。

同样用一个函数来说明:

fun(A& x)

{

         x = A(3);

}

 

我们调用fun(a)时,相当于A& x = a;那么在fun的作用域内,x就是a。所有对x的改变就是对a的改变。

也就是说,c++里的引用其实是扩展了a的作用域,我们知道c++中函数也是按值传递的,所以引用这样的操作是依靠指针实现的,调用fun(a)时相当于

A*  tmp_x = &a;

x 等价于(*tmp_x)。在fun内部所有使用x的地方都被替换为了*tmp_x

 

那么,有没有可能在java中实现c++中引用的效果呢?

如果想完全达到c++中引种的效果是不可能的,但是,可以通过一些包装来完成:

比如我们可以借助数组来实现,将原来的a包裹在一个数组内传递进去,我们可以更改fun的定义为:

fun(A[] x)

{

}

那么我们调用fun时,fun(new A[] {a})就可以了……

 

注:这里是错了,数组A[0]的位置存储的是a的值,因此对A[0]的改变不会影响a.......昨天脑残了.....所以这种方法是没有意义的,想达到c++的引用效果,在java里的应用层面基本是不可能的,必须从编译层面借助内存地址来实现...

 

python中的引用和java里的引用很类似,因此不做赘述。

 

java里还有一个问题,当变量类型为基本类型时,不像python一样存在指向常量的引用,而是和c++一样直接在栈上存储数据。这个主要是历史原因造成的,java当年为了兼容c++的部分语法而使得基本类型和c++中的基本类型类似,也就是说java不是完全的面向对象语言,intfloat等并不是对象……..

类似于这样的问题还有java中的泛型,为了兼容以前版本的代码使得泛型不得不通过擦除机制来实现,和c++的泛型比起来完全是形似而神不似。

 

鉴于以上种种,不得不非常佩服python3.0版本中表现出的壮士断腕般的勇气…….

 

执着于过去只会让未来的路越走越窄………

 

 

分享到:
评论

相关推荐

    C++引用&和指针在作为形参时的区别

    C++引用&和指针在作为形参时的区别 int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,...

    C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在。为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间。  引用不是变量,它仅仅是变量的别名,...

    c++面试题题目集锦

    秋招和暑期实习的c++面试集锦题目,1)指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 2)引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向...

    C++ 指针和引用的区别

     在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:  指针传递参数本质上是值传递的方式,它所传递的是一个地址值。  值传递过程中,被调函数的形式参数作为...

    c++中引用和指针的区别和联系

    引用是某块内存的别名(java中的引用其实也是别名的意思)。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可...

    引用即别名,与指针相似,改变被绑定的对象则引用也改变,如:.md

    个人笔记,别看

    详谈C++引用&和指针在作为形参时的区别

    在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的。 对于引用,有以下三条规则: (1)...

    浅析C++的引用与const指针与各种传递方式

    浅析C++的引用与const指针与各种传递方式 首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量;而 int * const p 跟上面是不一样的,即 p 是常量;我们知道引用只是一个别名,与变量共享存储空间,...

    C++中引用传递与指针传递的区别(面试常见)

    最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真没有考虑过。 ...

    从C语言过渡到C++之引用(别名)

    今天要讲的是C++中我最喜欢的一个用法——引用,也叫别名。 引用就是给一个变量领取一个变量名,方便我们间接地使用这个变量。我们可以给一个变量创建N个引用,这N + 1个变量共享了同一块内存区域。 1. 声明引用 ...

    c++将引用或者是指针作为函数参数实现实参的运算

    C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观。将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的...

    上课时的练习代码主要为C语言代码,部分C++.rar

    指针有自己的一块空间,而引用只是一个别名; 使用 sizeof 看一个指针的大小为4字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小; 指针可以被初始化为 NULL,而引用必须被初始化且必须是一...

    C++中引用与指针的区别(详细介绍)

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*...

    深入理解C++11:C++11新特性解析与应用

    附录中则介绍了C++11标准与其他相关标准的兼容性和区别、C++11中弃用的特性、编译器对C++11的支持情况,以及学习C++11的相关资源。《深入理解C++11:C++11新特性解析与应用》免责声明序前言第1章 新标准的诞生 11.1 ...

    C、C++用指针引用的差异

    1:并引述之间的区别在概念的指针  参考是可变的别名。例如  int m;  int &n=m;  引用作为一个别名。它在逻辑上不是独立的。它的存在具有依附性。所以引用必须在一?始被初始化。并且其引用的对象在其整个...

    C++中关于引用与指针

     C++中引用是起别名的意思,声明一个引用并不是定义一个新的变量。编译器会给他分配内存空间,因此引用本身占据内存空间,但是引用表现给用户看到的并不是引用自身的地址。  //如下程序  <code>int ee = 100; ...

    C++中指针和引用的区别详解

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向...

    C++中引用的使用总结

    引用时C++对C的一个重要的扩充,引用的作用是给变量起一个别名。 例如: int a; int &b=a;//声明b是a的引用 经过以上的声明,b就成为了a的别名,a和b的地位以及作用都是一样的。 将b声明为a的引用,不需要再为b开辟...

Global site tag (gtag.js) - Google Analytics