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


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要特殊理解,表象是传值,实际要看虚拟机实现




相关阅读:
.NET中读取Excel文件的数据及excelReader应用
MySQL使用命令备份和还原数据库
c# Graphics使用方法(画圆写字代码)
HTML5中的postMessage API基本使用教程
php中smarty模板条件判断用法实例
HTML5新增的Css选择器、伪类介绍
JavaScript字符串常用的方法
Javascript玩转继承(二)
jQuery事件绑定与解除绑定实现方法
一行命令搞定node.js 版本升级
ThinkPHP模板替换与系统常量及应用实例教程
举例说明如何为JavaScript的方法参数设置默认值
Win8如何使用自带的开始屏幕上的SkyDrive应用
Win8系统单击变双击怎么修复 Win8系统单击变双击修复方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 描述异地恋的句子 所谓伊人 2012酒店经理年度工作情况汇报 读《艾青诗选集》有感 欢乐谷,让我欢喜让我忧 天使vs恶龙(18)作文900字 第一次作文650字 什么男人发不了财,句句经典 我最喜爱的国度作文500字 你是我的一本书1200字 在全县春季动物疫病防控会议上的讲话 放手爱经典台词 《如何培养孩子专注力》学习心得 这样就够了 转作风要常“念”戒律 迎奥运创和谐作文500字 我的“司机生涯” 幼儿园副园长园务管理总结 归还天使礼物 没有人是为了爱你而来到这个世界 那一幕真让我难忘 编写会议记录的体会_秘书基础 为一段幸福,不断流浪 八年级暑假作业答案:地理 爸爸、妈妈请再爱我一次作文350字 2015竞选副主任演讲稿 猜猜他是谁作文150字 想你,已成为一种生活 春天里的遐想650字 小学二年级清明节作文 爱就两个字 成长路上1500字 被分手,离开前还随手把垃圾带走 悲伤爱情寄语大全 我想变成一朵白云 路过永恒之境作文450字 初中初二作文300字:儿时愚笨 小学五年级作文650字:石榴情 韶华将尽,人生没有如果 一次骑车出门 竞选校长生活助理 剧中剧 关于召开境外培训英语教师行前教育会议的通知 像蚂蚁那样成长作文 高二入团申请书200字范本 小学六年级作文750字:给玉树地震灾区小朋友的一封信 小学六年级作文750字:西鼠日记 糖担子 小学五年级作文450字:梦幻岛奇遇记⑴ 婆媳关系不好的原因

Copyright © 2016 phpStudy |