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. ssm配置文件叙述

    spring+springmvc+mybatis框架中用到了三个XML配置文件:web.xml,spring-mvc.xml,spring-mybatis.xml.第一个不用说,每个web项目都会有的 ...

  2. python学习笔记——(二)循环

    ·密文输入引入getpass库使用getpass.getpass("password:")tips:该功能在PyCharm中不好使,只能在命令行用 ·python强制缩进,省略了大 ...

  3. Ubuntu系统下Anaconda使用方法总结

    前言:个人认为Anaconda比pip使用起来要方便很多,因为它创建虚拟环境和下载各种库都很方便.但是有时候conda的安装方法中没有某些库,必须使用pip来进行安装.所以,主要用Anaconda,偶 ...

  4. Ubuntu如何百度云盘下载

    我使用Firefox浏览器下载. (1)先为浏览器下载一个插件:网盘助手 (2)通过终端安装aria2: sudo apt-get install python-apt sudo apt-get in ...

  5. 注意C语言 / 要想得到精确结果

    #include <stdio.h> int main(){    double r;    while(scanf("%lf",&r)!=EOF)    {  ...

  6. oracle数据库连接缓慢

    今天连接数据库时非常的慢,大概将近1分钟,才能连上,感觉不对,登录数据库所在的服务器,进行检查,常规的内存.硬盘.CPU全都正常,然后想要进入oracle用户时报错了:su: cannot set u ...

  7. Introduction tp Operating System

    一.虚拟化 为了让用户告诉操作系统如何利用虚拟机功能,OS提供给应用程序一些接口——系统调用,也会说提供了一个标准库. CPU通过分时达到虚拟化. 内存物理模型只是一个字节数组,读写修改需要制定地址. ...

  8. windows10环境下VMware14中Ubuntu16.04解决如何上网问题

    进入控制面板,网络和Internet,网络连接 点击以太网,查看详细信息 点击属性 --> 共享,允许其他网络-->选择VMnet1 点开虚拟机编辑选项 ,选择 VMNET1 仅主机,其他 ...

  9. pycharm汉化补丁

    将压缩包内容复制到 x:\xxx\JetBrains\PyCharm Community Edition 2019.1\lib 目录下 链接:https://pan.baidu.com/s/1TLEP ...

  10. 学习笔记TF062:TensorFlow线性代数编译框架XLA

    XLA(Accelerated Linear Algebra),线性代数领域专用编译器(demain-specific compiler),优化TensorFlow计算.即时(just-in-time ...