精华内容
下载资源
问答
  • Java到C++——指针与引用C++即有指针又有引用,而且很多时候具有相似的功能,常常容易让人混淆,着实让人头痛。用两句通俗的话说明两者本质的含意:引用就是一个变量或对象的别名(引用的本质是一个对象);指针是一...

    从Java到C++——指针与引用

    C++即有指针又有引用,而且很多时候具有相似的功能,常常容易让人混淆,着实让人头痛。用两句通俗的话说明两者本质的含意:引用就是一个变量或对象的别名(引用的本质是一个对象);指针是一个段内存空间的地址(指向存储一个变量值的空间或一个对象的空间);如下图所示:34fcf764275799da96e2fbfc4368e87a.png

    C++中的引用与指针

    引用

    引用是为变量或对象起的另外一个别名,定义形式:T& v;T为类型,v为变量名。使用引用时,注意以下几点:

    1.引用在创建的时候必须被初始化(指针可以在任何时候赋值)

    2.一旦引用初始化后,就不能改变引用所指向的变量(或对象),一直和该变量(或对象)邦定在一起。

    3.引用必须与一个确定的合法内存单元相关联。不存在NULL引用。(指针可以为NULL)

    下面用例子来解释,【例1】:voidReference()

    {

    //int &r1;//不符第1要点, 报错  Error:refercece value "r" requires an intializer

    //int & r2 = 100;//非const类型的引用,不能与常量邦定在一起

    inti = 10;

    int&r3 = i;//引用r2与变量i邦定在一起,符合第1要点

    cout <

    i = 15;//改变i的值,r3跟着改变,因为i和r3是指向同一块内存,符合第2要点

    cout <

    r3 = 20;//改变r3的值,i跟着改变,因为i和r3是指向同一块内存是,符合第2要点

    cout <

    inti2 = 25;

    r3 = i2;//并不是引用r3指向了变量i2,而是i2的值赋给了变量i(r3所指向的变量),符合第2要点

    cout <

    int& r4 = r3;//用引用r3指向的变量i的值初始化引用r4,所用r3,r4邦定的是同一个变量i;r3、r4、i指向同一块内存

    cout <

    Data d;

    Data& rData = d;//也可对对象进行引用,原理与变量一样。

    cout <

    d.iVal = 8;

    cout <

    }

    结果:

    初始值  i:10   r3:10

    改变i   i:15   r3:15

    改变r3  i:20   r3:20

    赋值r3  i:25   r3:25   i2:25

    引用r4  i:25   r3:25   r4:25

    d.iVal:0   rData.iVal:0

    d.iVal:8   rData.iVal:8

    我们也可以用debug模式对它进行调试,这样可以看到各个变量的内存地址,如下:27495b5b38797a924eab317f1658c872.png

    指针

    指针是指向另外一个类型的复合类型,定义形式:T* p;T为类型,p为指针变量。与引用类似,指针也实现了其它变量或对象的间接访问。使用指针变量p时,在p的前面加上*(即:*p)就是解引用符,用来访问指针所指向的对象。指针具有以下特点:

    1.指针本身就是一个对象,允许对指针进行赋值和拷贝;

    2.指针的生命周期内它可以先后指向几个不同的对象;

    3.指针无须在定义时赋初值;

    4.与内置类型一样,如果指针没有初始化,将指向一个不确定的值;

    5.不能定义指向引用的指针(因为引用不是对象,没有实际的地址)。

    【例2】voidTestPointer()

    {

    double* p1;//定义一个指向double类型的指针p1,指针未被初始化,可能指向任意一个地址

    doubledVal1 = 2;

    p1 = &dVal1;//给指针p1赋值, &是取地址符,也就是把dVal1的地址赋给p1

    cout <

    double* p2 = p1;//定义指针p2,同时将p1的值赋给p2,这时p1和p2指向同一个地址

    cout <

    }

    结果:

    p1:001AF6B8

    *p1:2

    p1:001AF6A8   p2:001AF6A8   *p1:5   *p2:5

    我们也可以用debug模式对它进行调试,这样可以看到各个变量的内存地址,如下:975fb67248e67d0084429d07f7f0bfbf.png

    指针的值的状态

    指针的值(即地址)应是下面四种状态之一:

    1.指向一个对象(或内置类型变量);

    2.指向紧邻对象所占空间的下一个位置;

    3.空指针,意味着没有指向任何对象;

    4.无效指针,也就是以上情况之外的其它值。

    举例解释【例3】voidTestPointer2()

    {

    shortsInt = 65;

    short*sP;//状态4,未被初始化,无效指针

    //cout <

    sP = &sInt;//状态1,指向变量ch

    cout <

    sP ++;//状态2,指向变量sInt所在地址的下一个地址

    cout <

    sP = NULL;//状态3,空指针

    cout <

    }

    结果:

    cP:0037FD54  *cP:65

    cP:0037FD56

    cP:00000000

    易错点

    对于初学者或是从其它语言转向c++的人来说,指针和引用这部分比较难,我觉得主要有以下几点,也是大家需要注意的:

    1.&符号的多意性(多个用途)

    &即用在引用也用在指针。定义引用变量,一般在“=”的左侧,在类型后加&符号(如果是在一行内定义多个引用,则每个变量名前加&);表示取变量地址,一般在“=”的右侧用于给指针赋值,&在变量名前面。voidTestSymbol()

    {

    intnVal1 = 5;

    intnVal2 = 6;

    intnVal3 = 9;

    int& rVal1 = nVal1;//定义引用

    int&rVal2 = nVal2, &rVal3 = nVal3;//定义引用

    cout <

    int*p1, *p2, *p3;

    p1 = &nVal1;//取nVal1的地址,给p1赋值

    p2 = &nVal2, p3 = &nVal3;//取nVal2, nVal3地址,分别给p2、p3赋值

    cout <

    }

    2.引用和指针的定义

    一行内定义多个引用,每个引用前都要加&;一行内定义多个指针,每个引用前都要加*。引用的类型要和它所邦定的变量或对象匹配;指针的类型要和它所指向的变量或对象匹配。voidReferencePointer()

    {

    intnVal1 = 10;

    intnVal2 = 20;

    int&rVal1 = nVal1, &rVal2 = nVal2;

    cout <

    int*p1 = &nVal1, *p2 = &nVal2, *p3 = &nVal2;//p2和p3指向同一个地址

    cout <

    doubledVal = 10.125;

    //double& rDVal = nVal1;//类型不匹配,编译错误

    //double *p = &nVal1;//类型不匹配,编译错误

    }

    结果:

    rVal1:10  rVal2:20

    *p1:10    *p2:20

    原文:http://blog.csdn.net/luoweifu/article/details/38308299

    展开全文
  • java指针和Static

    2016-07-27 18:42:11
    类里面定义的变量可以不初始化,因为会默认赋值。...Java指针 Java其实并不是没有指针,而是处处是指针。每个对象变量的值就是一个指针常量。当只是创建类变量时,它的值是null,只有通过new关键字,后才会返回

    类里面定义的变量可以不初始化,因为会默认赋值。八大基本类型变量值默认为0或者false,引用类型为null;

     

    临时变量(局部变量)不能加private,protected,public限定修饰符,也不能加static。

     

    Java指针

    Java其实并不是没有指针,而是处处是指针。每个对象变量的值就是一个指针常量。当只是创建类变量时,它的值是null,只有通过new关键字,后才会返回一个确定的地址值。比如:

    Person p = new Person();

    先分配内存存储数据(创建类中声明的变量,加载方法),再调用构造方法,最后返回内存地址,即指针。具体是,在new的时候先在堆空间对类的成员和方法地址申请相应大小的空间,然后会把这个值返回到栈空间,并赋值给P。

    因为java面向对象的特点,所以其实处处是指针,只不过它封装性,我们并不需要像c那样用*,->去直接操作,也保证了安全性。同时因为jvm的垃圾回收机制,我们也不需要用free()来手动处理垃圾数据。但是尽量还是要注意数据的管理。

     

    Static的用法

    Static (静态,共享)用类名就可以访问,静态属性的成员和方法在内存专有区,实例化一个类,生成对象时,先把静态成员和方法加载到这个专有区。

     

    静态的属性和方法与类绑定,非静态的属性和方法与对象绑定;静态的属性在整个应用中只有一份,而非静态的属性每个对象一份。建议使用类名而非对象名访问类的静态属性和方法。

     

    Static修饰变量和方法,可以节省内存。所以final的常量一般也是Static的。





     

    静态的方法不能访问非静态的方法和成员

     

    Super,this都是非静态的,不能在非静态的的方法中使用。

     

    巧用代码块{… }    静态代码块static{…}在类加载时只执行一次。

     

    静态方法不能被覆盖,即使与父类方法完全相同,也是两个不同的方法

    展开全文
  • java指针和对象关系

    2018-01-31 17:29:16
    java指针被严格管理不能任意操作指针,只能通过指针访问对象,或者对指针之间赋值,这很好保证java对象不受意外破坏和保证了安全性,java称这种指针为引用,引用和指针本质上相同的。  A a;是创建了一个指针的...

          java指针被严格管理不能任意操作指针,只能通过指针访问对象,或者对指针之间赋值,这很好保证java对象不受意外破坏和保证了安全性,java称这种指针为引用,引用和指针本质上相同的。


          A a;是创建了一个指针的变量,这时没有创建A的对象,指针变量的大小和一个整数是类似的。


          a = new A();首先执行等号的右半边new A(),根据A定义的class模板创建了a对象,这个对象是A类型的,对象要占用了一定的内存空间,占空间多少与我们A类所写的代码内容有关。对象所占用的内存是一片连续的内存空间,假设对象占用这片空间连续地址的开始地址是1,这称为对象的首地址。


          对象占用多少连续空间拥有多少地址与类的定义有关。我们记录一个对象的地址也仅记录这个对象所占用一片连续空间的首地址,对象创建完后将首地址放到a的指针变量中。


          a不是对象仅仅是一个指针类型的小变量,装的内容是对象的首地址,是对象在内存中的位置信息,由a变量我们就可以找到内存中的对象。将来可以通过a操作真正的对象。


          所有指针类型的小变量都是一样的,无论对象多大指向这个对象的指针也是一样的大小。


    A a = new A();
    A b = new A();
    a = b;
          a=b是对指针进行操作,实际是把b所指向的地址复制到a中,那a中原本的地址就丢失了,a指向了一个新的对象,  a和b也就指向了一同一个对象,那么原来a指向的对象就失去了引用,也就是我们所说的垃圾对象。这种赋值动作并没有改变对象仅仅是修改了指针的值。


          一个指针只能指向一个对象或不指向对象,不指向对象值就是null,一个对象允许有0个或多个指针指向它。


          一个对象如果没有任何指针指向它,这个对象就称为垃圾对象,因为java只能通过指针才能访问对象,没有指针指向的对象将无法使用无法访问,在将来将被java的内存回收机制给回收掉。

    展开全文
  • java指针

    2021-02-05 15:14:02
    JAVA指针,因为JDK中封装了指针。 对象的声明和定义 1) 声明是指定义一个指向该对象的指针变量。 2) 定义是指用new关键字在堆内存中创建了对象,并把他的首地址付给那个指针变量。 创建一个对象时 有一个...

    JAVA有指针,因为JDK中封装了指针。

    对象的声明和定义

    1) 声明是指定义一个指向该对象的指针变量。

    2) 定义是指用new关键字在堆内存中创建了对象,并把他的首地址付给那个指针变量。

     

    创建一个对象时

    有一个栈内存指向堆内存 这是一个指针

    User u1=new User();

    u1.setName("张三");

    User u2=u1;

    此时他们栈地址不同 但指向的是一个堆

    System.out.println(u2.getName());

    此时打印出张三

    u1.setName("李四");

    再去打印

    System.out.println(u2.getName());

    此时打印出李四

     

    他们的堆地址是相同的

    即便u1是方法的参数 在方法中发生变化 方法外的u2也产生变化

    同时u2的变化也会影响到u1

    System.out.println(u1 == u2); 为true

     

    此时

    User u3=new User();

    User u1=u3;

    这里的u1栈地址指向了u3的堆地址

     

    当u1的堆地址没有被指的了 java的垃圾回收机制 会回收该堆内存 (不是立即回收)

     

     

    两个栈地址 指向了一个堆 则==为true

     

    u1 如果加了final关键字 则本身的 栈地址 指向 堆地址不能被修改,即不能指向别的堆地址

    u1=u2报错

    但是其堆地址是可以被其他的栈地址修改的 他的堆内存中存放的内容也是可以修改的

    展开全文
  • java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类。 一。定义类   类由N个 构造器 成员变量 方法组成,可以不定义,也可以根据语法定义N个。  [修饰符] class 类名{  构造器*N个  ...
  • JAVA指针

    2015-11-27 22:02:00
    首先,提个问题:JAVA中没有指针JAVA中...(现在我们就来找到这个指针)我的理解:在声明一个对象的时候,其实就是定义了一个指针变量。注意: 1、指针变量有两层含义 1) 指针变量里存的是地址(它指向的变量的首...
  • C语言的强大在于可以直接操作指针的地址,通过改变指针的地址指向来达到更改地址的目的,又是由于c语言的指针过于强大,初学者很难掌握, java的出现解决了c,c++中指针的问题 java指针封装在底层,开发人员是不...
  • Java定义Map型数组报空指针异常

    千次阅读 2018-07-12 15:51:19
    示例代码: Map&lt;String, Object&...报空指针异常。 修改为下所示。 Map&lt;String, Object&gt;[] map = new Map[4]; map[0] = new HashMap&lt;String, Object&gt;(); map...
  • Java 指针和字符串简述

    千次阅读 2016-05-28 19:22:05
    (1)对象数组的定义与访问 定义对象数组: 类名 数组名[元素个数]; 访问对象数组元素,通过下标访问: 数组名[下标].成员名 (2)数组元素所属类的构造函数 元素所属的类不声明构造函数,则采用默认构造函数...
  • java快慢指针

    2020-10-12 17:06:31
    创建环形列表 //创建一个环形的单向链表 class CircleSingleLinkedList { // 创建一个first节点,当前没有编号 private Boy first = null; // 添加节点,构建成一个环形链表 ... // 定义辅助节点 Boy
  • java异常定义

    2018-06-30 13:05:56
    1:空指针异常 NullPointerException 2:IndexOutOfBoundsException |--ArrayIndexOutOfBoundsException |--StringIndexOutOfBoundsException 3:ClassNotFoundException FileNotFoundException 4:类型转换...
  • JAVA名词定义

    2008-12-29 09:55:10
    JAVA定义:Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。   Java的主要特性:   1、Java语言是简单的。Java语言的语法与C语言和C++语言很...
  • 指针是c、c++和go这些需要动态分配内存等功能的语言用到的,笔者在刚开始使用的时候,经常混淆指针定义和使用,下面总结一下。 c/c++的写法 void pointDemo() { int normalVar = 1; //定义普通变量 int *...
  • java指针异常

    2017-10-17 10:12:59
    java指针异常 老遇到这个报错。。   String param = 。。。。或者可以是 null; if ( param.equals( "abcd" ) ) { // param 是 null 就会报错。所以需要先对字符串判空  。。。 } 另外,在 ...
  • java实现函数指针

    2019-10-09 03:47:51
    Java程序员面试笔试宝典中看到的东西,感觉很有用,特开此文 函数指针一般作为函数的参数来使用,...在Java中没有指针的概念,如何在Java语言中类似函数指针的功能呢?具体思路如下 ①定义一个接口,接口中声...
  • java指针问题

    2019-12-06 10:43:45
    在声明数组后没有实例化(使用new申请空间)而去使用数组...2、在定义数组的时候可以直接初始化数组长度; 第1种方式的优缺点,优点:在项目较大业业务逻辑比较复杂时效率高,及在用的时候从i才去开空间。 ...
  • 学习java中空指针异常

    2020-04-24 12:34:30
    定义 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 出现空指针异常的前提条件是? “空引用” 访问实例相关【对象相关】相关的数据时,都会出现空指针异常。 垃圾回收器: GC 在java语言中,垃圾回收器...
  • (作者声明:对于Java编程语言...定义Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java具有简单性、面...
  • (作者声明:对于Java编程语言...定义Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java具有简单性、面...
  • 在C中数组的定义格式是int a[10]; 但是在java中数组的格式是 int a[];...,但是java更推荐我们使用后一种定义方式,因为这样比较符合类型的规范,int +[] 说明这是一个数组。 #include <iostream> using name...
  • java 没有指针 只能通过调用对象的引用的函数来实现函数的调用 在c中 一个函数指针可以接收同种模型的函数地址,即使它们函数名不同。 要实现这种多态,要用java中的父类引用指向子类引用,通过子类的重写,父类...
  • 指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。形式:一维指针数组的定义形式为:int【类型名】 *p【数组名】 [4]...
  • C++有关指针的数据类型和指针运算的小结前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下。1) 指针变量加/减 一个整数例如:p++,p--,p+i,p-i,p+-i,p-=i等。C++规定,一个指针变量加/减一个...
  • java指针避坑指南

    2021-02-09 21:32:51
    最近自己的团队,开发过程中遇到过N多的空指针问题。 虽然问题都比较low,也就是常说的一些低智商问题。 但是,生产环境出现空指针,也是很要命的事情。 什么是空指针指针发生最常见的就是,“使用一个...
  • JAVA里面的“指针

    2017-03-23 14:16:00
    JAVA里面的“指针” ...在java里面没有指针定义。但是java里面的“指针”无处不在。下面将进行介绍。我们知道JAVA里面用的最多的就是对象,我们经常将一个对象传递给不同的变量,例如: [ja...
  • java指针么?

    2011-06-10 13:29:09
    java中引用的作用类似于指针,但是有区别: 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患) 但是引用定义出来后默认指向为空。 指针可以随意操作,但是引用不可以随便...
  • 动态库提供一个外部函数 IVS_SDK_GetDeviceList, pCameraInfoList用于...我的问题是,使用java jna使用该外部函数时,pCameraInfoList这一块缓冲区参数如何定义和传递?返回后如何从缓冲区100个数据集,逐条取得信息?
  • 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素...1.按照双指针的套路定义left和right,两个指针同时走遇 到目标值,此时left停下,right++,直nums[right]!=target; 2.此时nums[rigth]!=targe

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,161
精华内容 1,264
关键字:

java指针定义

java 订阅