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. iis7 绑定多个ssl证书

    默认情况下iis上只能绑定一个ssl证书,如果多的话 会只认一个. 停止IIS 运行[ CMD]  ,  输入 [iisreset /STOP] 第一步:修改配置文件. 然后打开:C:/Windows ...

  2. PSP耗时

  3. 通过for 来获取数组里面的电话

    //存放的是电话号码包含的数字 , , , , , }; //电话号码出现的下标 , , , , , , , , , , }; //方式1 ; i < index.length; i++) { ...

  4. webservice接口和http接口介绍---更新版

    web service(SOAP)与HTTP接口的区别什么是web service? soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: te ...

  5. 组件_ UIToolbar

    组件_ UIToolbar  /** 1. 顶部toolbar 2. TextField可以以UIBarButtonItem的自定义视图的方式加入toolbar 3. 三个按钮 4. 将UIBarBu ...

  6. 一个mysqldump的报错

    1.MySQL版本 5.7.14-log 2.问题分析 mysqldump -uxxx -pxxx db_nale 一般来讲上述命令主要是用于MySQL的逻辑备份,用来备份某个数据的全部表,但是我在执 ...

  7. 如何使用python在保留原excel格式的前提下插入/修改数据

    一.需求分析: 统计的报表中需要每日查询当天数据并追加到原有的excel后面. 因为原始excel格式已经设定好,如果使用xlwt,仅仅指定设定我们要插入的单元格的格式,原始数据的格式会被初始化. 所 ...

  8. Linux 下安装nodejs

    linux 版本 uname -a Linux -29deepin-generic # SMP Fri Jul :: UTC x86_64 GNU/Linux Nodejs 版本:node-v10.1 ...

  9. 20164318 毛瀚逸 Exp1 PC平台逆向破解

    一.逆向及Bof基础实践说明 1.1实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 手工修 ...

  10. 基于tomcat获取在线用户数

    https://blog.csdn.net/smallnetvisitor/article/details/84697505 需求: 统计某应用的在线用户数 实现方案: 1.基于session监听(复 ...