C++指针  要区分指针变量和指针变量所指对象。

指针变量先是一个变量,它有自己的地址和存储的内容,所以要想清楚是改变指针变量的值(即地址),还是改变指针变量所指对象的值。

 #include <iostream>
#include <string>
using namespace std; void f(int *&x){ //改变指针变量的值 int *&x ++x -->指针变量存储的地址值加上对应字节
++x; //改变指针变量所指变量的值 int *&x ++(*x) -->变量值加1
} //int *x ++(*x) -->变量值加1 void m(int *c){
int temp = ;
int *a = &temp;
c = a;
} int main()
{
int x []={,};
int *p= x;
cout<<"before x:"<<*p<<endl;
cout<<"before p:"<<p<<endl;
f(p);
cout<<"now x:"<<*p<<endl;
cout<<"now p:"<<p<<endl;
m(p);
cout<<"test function m: p ="<<p<<endl;
return ;
}

补充:C++中引用 &,表示这个函数形参不是拷贝了,而是实实在在本身,对这个动手脚就是动了传入的实参。(记住需要改变的变量用引用型或者二级指针,数组可以理解为引用型)

 而java中的引用基本是和指针一样,所以要考虑是改变引用对象的值,还是引用存储的“地址值”(内存中对象的地址)。java中一切都是值传递,没有二级指针的概念,在通过赋值操作给函数形参,是不会改变引用存储的“地址值”,只能改变其所指对象的值,可以用返回值的形式改变引用的“地址值”。总之,Java中的引用仅仅只是管理和命名对象。

补充概念:(非原创,详情点击标题链接)

1.赋值操作

对于基本类型 ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。

2.java是值传递

package test_refer;

public class Test {

    public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "hello ";
String s2 = "world";
System.out.println("before s1 "+s1);
System.out.println("before s2 "+s2);
swap(s1,s2);
System.out.println("after calling function swap");
System.out.println("now s1 "+s1);
System.out.println("now s2 "+s2); } static void swap(String a,String b){
System.out.println(" in the function swap");
System.out.println(" before a "+a);
System.out.println(" before b "+b);
String c= a;
a = b;
b =c;
System.out.println(" now a "+a);
System.out.println(" now b "+b);
} }

   //参数为对象,不改变引用的值 ??????

    public static void add(StringBuffer s) {

        s.append("_add");

    }

    //参数为对象,改变引用的值 ?????

    public static void changeRef(StringBuffer s) {

        s = new StringBuffer("Java");

    }

    public static void main(String[] args) {

        StringBuffer sMain = new StringBuffer("init");

        System.out.println("sMain=" + sMain.toString());//sMain=init

        add(sMain);

        System.out.println("sMain=" + sMain.toString());//sMain=init_add

        changeRef(sMain);

        System.out.println("sMain=" + sMain.toString());//sMain=init_add

    }

分析:在changeRef方法中,参数也是对象,当把sMain传给参数s时,s得到的是sMain的拷贝,但与add方法不同的是,在方法体内改变了s指向的对象(也就是s指向了别的对象,牵着气球的绳子换气球了),给s重新赋值后,ssMain已经毫无关联,它和sMain指向了不同的对象,所以不管对s做什么操作,都不会影响sMain指向的对象,故调用changeRef方法前后sMain指向的对象内容并未发生改变。

参考示意图:

C/C++中指针和java的引用区别的更多相关文章

  1. Java的引用c++的引用和C指针的区别

    Java的引用本质上就是C中的指针,而c++的引用则完全不同:有一个类 class Point { int x; int y;} 同样的一个Point p; 在Java中p表示一个引用,它等同于C语言 ...

  2. C#中指针的简单使用

    原来C#不仅仅支持和C/C++中指针(或者说是引用)很像的委托delegate,还支持在unsafe代码块中使用指针,从而写非托管的代码(人为不让垃圾回收机制来管理相应的内存).在unsafe中就可以 ...

  3. Java中到底有没有指针;同时注意引用和指针的区别

    Java中引用的作用类似于指针,但是有区别:()    (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空.     (2) 指针可 ...

  4. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  5. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  6. Java中的引用类型(强引用、弱引用)和垃圾回收

    Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...

  7. 实践出真知-所谓"java没有指针",那叫做引用!

    java没有指针,那我们如何实现动态数组呢? 上篇评论提及 ”不仅有vector,还有ArrayList,还有List,可做选择“. "java没有指针",那叫做引用! 今天尝试了 ...

  8. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  9. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

随机推荐

  1. 阿里云挂载硬盘(windows)

    1.运行:diskmgmt.msc,打开磁盘管理,看到未分配的盘符.点右键,新建简单卷: 2.设置卷大小.根据实际情况可设多设置. 3.分配盘符.格式化: 4.格式化完成: 5.看到了新分区:

  2. 【转载】 第四范式涂威威:AutoML技术现状与未来展望

    原文地址: https://www.jiqizhixin.com/articles/2018-07-12-17 -------------------------------------------- ...

  3. Hive元数据找回

    如果不小心删除了了hive的元数据文件(/user/hive/warehouse),只要先前core-site.xml文件中设置了fs.trash.interval属性就可以找回.hdfs会为用户创建 ...

  4. Number.toLocalString() js

    地址链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocal ...

  5. rem 自适应适配方法

    rem是指相对于根元素(html)的字体大小的单位,它是一个相对单位,它是css3新增加的一个单位属性,我们现在有很多人用的都是px,但px是一个绝对单位,遇到分辨率不同的设备,做出的页面可能会乱,这 ...

  6. linux虚拟机时间同步

    方法来源于网上,但是经过验证是可行的. 作为linux学习的新手,开始学习时总会遇到各种各样的麻烦,每次开机发现自己的虚拟机总是与当前的时间相差几个小时到几天不等,查阅网上经验,我的做法是 1.使用y ...

  7. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  8. VMWare安装

    1. VMware 的下载和安装 VMware Workstation 15 Pro for Windows(64 位)的下载地址如下: 官方试用版地址:http://www.vmware.com/c ...

  9. 古墓丽影:崛起 PC版今日发售

    之前xbox one的独占游戏 古墓丽影: 崛起(Rise of the Tomb Raider™), 今天正式在steam发售了, 之前就可以预购.简单看了一下, 画风跟前代类似, 但是画面更好, ...

  10. JAVA工具类-StrUtils

    public class StrUtils { public static final String UTF_8 = "UTF-8"; /** * 去掉小数字符串后面无用的零 */ ...