java及C++中传值传递、引用传递和指针方式的理解_java

java的值传递理解:

代码1:

public class Test {   

  /**
   * @param args
   */
  public static void main(String[] args) {
    StringBuffer buffer= new StringBuffer("colin");
    SChange(buffer);
    System.out.println( buffer);
  }   

  public static void SChange (StringBuffer str) {
    str= new StringBuffer("huang");
  }   

}

代码2:

public class Test {   

  /**
   * @param args
   */
  public static void main(String[] args) {
    StringBuffer buffer= new StringBuffer("colin");
    SChange(buffer);
    System.out.println( buffer);
  }   

  public static void SChange (StringBuffer str) {
    //str= new StringBuffer("huang");       str.append(" huang");
  }   

}

再分别用两张图来解释上面的代码1、代码2:

原始状态

代码1图解:

代码2理解:

代码一中, copy的那个引用, 指向了一个新的对象。 但原对象还是没有变化的。

代码二中, copy的那个引用, 把原对象改变了。

这就是Java的值传递。

C++中两种传递的区别:

对于C++值传递、引用传递、指针方式用如下代码理解,自己运行测试

#include <stdio.h>
#include <iostream>
#include <typeinfo>
void ByValue(int a)
{
  a = a + 1;
}
 void ByRef(int& a)
{
  a = a + 1;
}
 void ByPointer(int* a)
{
  *a = *a + 1;
}
 int main(int argv, char** args)
{
  int v = 1;
  ByValue(v);
  ByRef(v); 

  // Pass by Reference   ByPointer(&v); 

  // Pass by Value   int* vp = &v;
  ByPointer(vp); 

  std::cout << v << std::endl; // std::cout << typeid(vp).name() << std::endl;
// std::cout << typeid(&vp).name() << std::endl;    std::cout << "end" << std::endl;
}

第一个是值传递,第二个函数是引用传递,但是后面两种,同一个函数,一次调用是Call by reference, 一次是Call by value。

因为:

ByPointer(vp); 没有改变vp,其实是无法改变。值传递

ByPointer(&v); 改变了v。引用传递(你可能会说,这传递的其实是v的地址,而ByPointer无法改变v的地址,所以这是Call by value。这听上去可以自圆其说,但是v的地址,是个纯数据,在调用的方代码中并不存在,对于调用者而言,只有v,而v的确被ByPointer函数改了,这个结果,正是Call by reference的行为。从行为考虑,才是求值策略的本意。如果把所有东西都抽象成值,从数据考虑问题,那根本就没有必要引入求值策略的概念去混淆视听。)

nob:以上理解认可,补充指针方式可以使用两种方式,值传递:传递一个指针;引用传递:传递一个变量的地址或者引用;如果使用typeid(x).name()查看&v和vp发现都是Point类型,所以两种表现,同一种结果。你可能会想我这样

ByValue(&v);  //error

,而在C++中传递不同类型的参数直接编译不通过。

总结:

所以我觉得传值还传引用先看内存上怎么走就行了

share内存就是传引用,copy内存就是传值(先抛开一些特殊情况)

这样的话:

C/C++:默认传值,引用传引用,指针单独理解(指针可以理解为既可以传值、也可以传引用,而产生结果相同)

JAVA:基础数据类型值传递,对象也是值传递(把这个对象的引用copy了一份)

C#:值类型传值,引用类型传引用,ref/out特殊理解

JAVA和C#的string要特殊理解,表象是传值,实际要看虚拟机实现

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, c++
传值传递
引用传值 指针传地址、指针传递和引用传递、指针传递 引用传递、指针的引用传递、指针引用参数传递,以便于您获取更多的相关知识。

时间: 2025-01-02 16:09:29

java及C++中传值传递、引用传递和指针方式的理解_java的相关文章

php函数传值的引用传递注意事项分析_php技巧

本文实例讲述了php函数传值的引用传递注意事项.分享给大家供大家参考,具体如下: Strict standards: Only variables should be passed by reference 网上查到资料有这么一句话: 在php5.3以上版本会出这个问题,应该也和php的配置有关,只要把这一句拆成两句就没有问题了.因为array_walk的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值.当然你也可以修改php.ini 里的 error_reporting

C++中的值传递,引用传递及指针传递

C++的值传递,引用传递,指针传递这些概念一直是困扰C++程序员,我一直也没有一个能说清他们之间的关系通过一个简单的实例,或者说浅显的说法,找了一些相关资料,和自已的个人感受,简单介绍一下. c++中传递参数的方式有三种:传参数的值(称为值传递,简称传值),传参数的地址(称为地址传递,简称为传址),和引用传递(简称为传引用),相应的函数也就是传值调用,传址调用和传引用调用 函数定义时参数表中的参数称为形式参数,简称形参,函数调用时参数表中的参数称为实际参数,简称实参,实参和形参之间的数据传递称为

怎样用java实现 c#中Datarow[索引] 的取值的方式 ?

问题描述 怎样用java实现 c#中Datarow[索引] 的取值的方式 ? 怎样用java实现 c#中Datarow[索引] 的取值的方式 ?比如我有定义一个这样的数组:HashMap map=new HashMap<>();如何实现如下取值?map[""key""]=""值""; 解决方案 java不支持索引器,所以给出的解决方案就是使用方法代替(其实C#的索引器也是方法,只是写法上简化了点)比如map.get

php函数间的参数传递(值传递/引用传递)_php技巧

php:函数间的参数传递 1.值传递 复制代码 代码如下: <?php function exam($var1){ $var1++: echo "In Exam:" . $var1 . "<br />"; } $var1 = 1; echo $var1 . "<br />"; exam($var1); echo $var1 . "<br />"; ?> -------------

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

JavaScript传递变量: 值传递?引用传递?_javascript技巧

当变量A赋值给变量B时,会将栈中的值复制一份到为新变量分配的空间中. 如何理解? 复制代码 代码如下: var x = y = 1; y = 2; alert(x); x的值为多少? 复制代码 代码如下: var obj = {}; var sub = {}; sub['id'] = 3; obj['sub'] = sub; sub['id'] = 4; alert(obj['sub']['id']); obj['sub']['id']的值又为多少?他们真的符合你的预期吗? 我们分别运行2段代码

Java设计模式编程中简单工厂与抽象工厂模式的使用实例_java

简单工厂模式类图 通过一个工厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.println("加法&qu

Java多线程编程中使用Condition类操作锁的方法详解_java

Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法.不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的:而Condition是需要与"互斥

解析Java和Eclipse中加载本地库(.dll文件)的详细说明_java

最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对大家的类似工作有所帮助首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述.其次,Java中加载dll的方式