精华内容
下载资源
问答
  • golang获取变量地址值和指针变量示例
    千次阅读
    2020-12-27 21:01:56
    package main
    import "fmt"
    // & *
    func main()  {
    	a:=100
    	fmt.Println("a的地址:",&a)
    
    	var ptr *int=&a
    	fmt.Println("ptr指向的值是:",*ptr)
    }
    
    更多相关内容
  •   “Java中直接打印对象,输出的是对象的地址值(对象的类没有重写toString方法)”,这是初学者在学Java基础语言的时候,大多数教程都是这么介绍的,初学者也会认为这就是对象在内存中存储的位置,如输出的地址值...

    前言

      “Java中直接打印对象,输出的是对象的地址值(对象的类没有重写toString方法)”,这是初学者在学Java基础语言的时候,大多数教程都是这么介绍的,初学者也会认为这就是对象在内存中存储的位置,如输出的地址值为:

    cn.imcyc.person.Person@11ff03
    

    但是,其实这种说法是有混淆性的,实际上,打印对象输出的“地址值”并不是对象的物理存储地址,@之后的“11ff03”只是这个对象的哈希值的十六进制。

      实际上,Java语言中其实是看不到变量/对象真正的物理地址值的,只能通过hashCode方法查到变量/对象的哈希值,在极少数的情况下,变量/对象的哈希值会重复,也就是“哈希碰撞”、“哈希冲突”现象。如果初学者看到两个不同数据的类型/对象打印出的“包名.类名@十六进制哈希值”是一样的,就会误以为这两个类型/对象的地址值是相同的,这种想法是错误的。

      下面介绍一种“哈希冲突”的情况。

    哈希值相同的String类对象

    String a = "重地";
    String b = "通话";
    System.out.println(a.hashCode());
    System.out.println(b.hashCode());
    

    上面代码的执行结果是:

    1179395
    1179395
    

    字符串类对象a和b的哈希值是相同的,但事实上两者的物理存储地址是不同的。那么如果将“重地”和“通话”作为字符串存储到对象中,对象的哈希值会一样吗?

    哈希值相同的自定义类对象

      新建一个Person类,有一个私有字符串数据成员,两个构造函数,如下:

    public class Person {
        private String name;
        
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    }
    

      主程序执行如下代码:

    Person c = new Person("重地");
    Person d = new Person("通话");
    System.out.println(c);
    System.out.println(c.hashCode());
    System.out.println(d);
    System.out.println(d.hashCode());
    

    执行结果:

    cn.imcyc.person.Person@75412c2f
    1967205423
    cn.imcyc.person.Person@282ba1e
    42121758
    

      可以看到,对象c和d的哈希值不同的。

    拓展:重写Person类的hashCode方法

      重写了hashCode方法的Person类代码为:

    public class Person {
        private String name;
        
        @Override
        public int hashCode() {
            return name != null ? name.hashCode() : 0;
        }
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    }
    

    上面重写的hashCode的方法是IDEA默认生成的,可以看到就是把数据成员name的哈希值拿来当对象的哈希值,再次执行主程序的代码,输出为:

    cn.imcyc.person.Person@11ff03
    1179395
    cn.imcyc.person.Person@11ff03
    1179395
    

    可以看到这时的c和d两个对象的哈希值就相同了,但是能说对象c和对象d的地址值相同吗?显然是不能的,对象c和对象d的物理存储地址一定是不同的。

    相关文章推荐

      【Java】超严谨论证:为什么自定义类存储到Set集合中,要重写hashCode方法和equals方法

    展开全文
  • 打印输出会调用Object.toString,String重写toString()返回值时:return this 但是这不还是一个地址值吗? 那为什么输出的是一个字符串呢而不是地址呢? 忘大神能够指点,先行谢过啦
  • 函数返回地址值

    千次阅读 2019-01-16 20:20:39
    #include <iostream> #include<stdio.h&...int *fun(int *a, int *b)///形参为指针变量时形参和实参数据是可以传递的 ...///把a,b中较大数的那个地址作为函数值传回 return b; } int ...

     

    #include <iostream>
    #include<stdio.h>
    using namespace std;
    int *fun(int *a, int *b)///形参为指针变量时形参和实参数据是可以传递的
    {
        if( * a > * b)return a;///把a,b中较大数的那个地址作为函数值传回
        return b;
    }
    int main()
    {
        int x,y,*p;
        printf("Enter x y: ");
        scanf("%d%d",&x,&y);///实参取地址,将x地址作为参数传递给a
        p=fun(&x,&y);///函数的数据类型可以是数据类,可以是指针类型
        printf("x=%d + y=%d *p= %d\n",x,y,*p);
        return 0;
    }
    

     

    展开全文
  • 打印指针指向的地址值

    千次阅读 2019-01-08 08:45:58
    每次输出的地址值都是一样的,自然想到其实输出的是指针变量的地址值,指针变量是没有变化的变化的是指向的内存地址。 修改,新的代码如下: static void print_cpu_src(uint8_t * src, int stride){ ...

    废话不多说,直接上错误代码:

    static void print_cpu_src(uint8_t * src,int stride){
        int i,j;
        printf("Magnum  cpu src addr == %p, stride ==%d:\n",&src,stride);
         for (i = 0; i < 11; ++i) {
                 printf("\n");
                for (j =0; j < 4; ++j) {
                              printf("%d ,", src[j]);
                }
                src +=  stride;
                printf("new src addr %p\n",&src);
              }
         printf("\n");
    }
    View Code

    输出结果:

    Magnum cpu src addr == 000000000022F4C0, stride ==800:

    129 ,124 ,122 ,124 ,new src addr 000000000022F4C0

    130 ,125 ,122 ,125 ,new src addr 000000000022F4C0

    132 ,125 ,123 ,125 ,new src addr 000000000022F4C0

    132 ,126 ,123 ,125 ,new src addr 000000000022F4C0

    151 ,127 ,124 ,126 ,new src addr 000000000022F4C0

    151 ,127 ,125 ,126 ,new src addr 000000000022F4C0

    153 ,128 ,125 ,127 ,new src addr 000000000022F4C0

    154 ,128 ,125 ,127 ,new src addr 000000000022F4C0

    157 ,129 ,125 ,127 ,new src addr 000000000022F4C0

    158 ,129 ,125 ,127 ,new src addr 000000000022F4C0

    161 ,130 ,125 ,128 ,new src addr 000000000022F4C0

    每次输出的地址值都是一样的,自然想到其实输出的是指针变量的地址值,指针变量是没有变化的变化的是指向的内存地址。

    修改,新的代码如下:

    static void print_cpu_src(uint8_t * src,int stride){
        int i,j;
        printf("Magnum  cpu src addr == %p, stride ==%d:\n",(int)src,stride);
         for (i = 0; i < 11; ++i) {
                 printf("\n");
                for (j =0; j < 4; ++j) {
                              printf("%d ,", src[j]);
                }
                src +=  stride;
                printf("new src addr %p\n",(int)src);
              }
         printf("\n");
    }
    View Code

    总结:

    其实指针 *src,  src 就是指向的地址值,直接打印它即可

    展开全文
  • java之地址值和hash值的关系(文字版)

    千次阅读 2018-04-01 23:28:45
    论点1:对象默认的hash值可以认为就是对象的地址值;论点2:我们覆盖hashCode()方法的目的是为了让我们认为相同的元素得到的hash值相同; 简而言之:就是为了去重;1.我们自定义一个Person类(这个类没有显式覆盖Object中...
  • 有时候使用System.out.println()方法输出一个类的对象,得到的结果却是该对象的地址:类名@15aa56487 这个结果是怎么来的呢? System.out.println(p);//p是一个person类对象 System.out.println(p.toString()); ...
  • 为什么打印String对象,不是地址值

    千次阅读 2017-07-18 19:14:47
    为什么String打印的不是这样一个地址值呢?因为String类继承自Object类,重写了从Object类拿到的toString()方法,返回的是该该对象本身,即字符串。详见下面API中Object的toString()方法和String类的toString()方法:...
  • C++ 地址和地址值

    千次阅读 热门讨论 2017-09-24 21:55:10
    今天一起讲自考,一说到地址和地址值就蒙圈了。
  • 包装类,自动装箱后部分对象地址值相同的问题 首先,讨论一下什么是包装类.包装类是一个统称,指的并不是一个类,而是一些类.包装类是针对于基本数据类型而产生的类.所以有几个基本数据类型,就有基本包装类. 其产生的...
  • C++读某个内存地址对应的

    千次阅读 2020-09-04 17:06:19
    C++读某个内存地址对应的 举个栗子,这里的内存地址对应的是int类型,读取时候需要将地址,转化为int类型的指针,然后用*运算符取得该地址对应的。 0x61fe08为我想要读的内存地址,代码如下: int result=*(int ...
  • js 引用和地址引用

    万次阅读 2019-01-25 10:01:27
    测试 数字类型 var m = 1000; var n = m;...数字、字符串、布尔类型的为原始类型,是引用 数组、对象类型为地址引用 引用 可以深拷贝 地址引用 循环到原始类型方可进行深拷贝
  • C/C++按传递和按地址传递

    万次阅读 多人点赞 2018-04-06 19:41:11
    C/C++的按传递和按地址传递有明显不同,下面对他们作个区别:按传递:在调用函数中将原函数的拷贝一份过去被调用的函数,在被调用函数中对该的修改不会影响原函数的。按地址传递:在调用函数的时候将原...
  • 在汇编语言中,可以很轻松地将立即数或变量写入到指定地址,或从指定地址读取数据, 但是在C语言中,如何实现这一功能? #include "stdio.h" int main() { int *p;//定义一个整形指针 p = (int *)0x0019FF3C;//...
  • 2.指针地址的值,指的是p的地址值,写作&amp;p,这个地址代表的内存,存储出是P的值,类型为**型,也就是二级指针; 3.指针指向的值,指的是p值代表的地址上存储的值,写作*p,在这里就是变量a的值,类型为...
  • python获取内存地址上存储的

    千次阅读 2019-10-04 02:34:59
    但是反过来,怎么获取内存地址上存储的? 先看一段代码: from ctypes import string_at from sys import getsizeof from binascii import hexlify a = 2333 print(hexlify(string_at(id(a),g...
  • 哈希地址值得区别

    千次阅读 2017-10-15 12:38:31
    哈希值和地址值是不一样的,哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的,也就是说哈希值是一种逻辑上的确保唯一性,...
  • 在这里以一维数组举例: ...这三者的地址值是相同的,但第3与1、2含义却不一样,1与2不管是地址值还是含义都是一样的。 下面给出程序验证: 可以看到,c+1和&c[0]+1是以一个char型大小为单位增加的,而&c...
  • C++指针地址和指针的

    千次阅读 2018-12-28 19:57:49
    C++指针 学过C++ 都知道,指针是一个很重要的概念,他是C++的灵魂,在上学的时候从书山了解到,指针就是指向内存的地址,然,今天和同事讨论...但是指针的和指针的地址是不同的。。。突然感觉自己好菜哦!!! ...
  • //0行起始地址 0行0列元素地址 printf("%d,%d\n", a[0], *(a + 0)); //0行0列元素地址 printf("%d,%d\n", &a[0], &a[0][0]); //0行起始地址 0行0列元素地址 printf("%d,%d\n", a[1], a+1); //1行0列元素地址 1行...
  • 关于java中String的地址的问题

    千次阅读 2017-03-29 10:45:55
    来源: ... class Test1 { public static void main(String[] args) { String a = "abc";// 问题1,是不是在堆内存的常量池里放了“abc”然后在栈内存里放了a,a中存的是常量池里abc的地址? St
  • equals方法没有重写还是比较对象地址 重写equals方法后要看是如何重写的(Object(地址)、Integer()、String(先地址地址不同相同返回true)、自定义类(可以自己定义)) 下次,你知道该怎么回答了吗?
  • 使用JS有一个很恼人的问题,当我把对象赋值给新的对象后,新的对象改变了,旧的对象也会跟着改变,如以下例子: // 被引用的对象 var oldModel = { name: "oldModel"... // 只改变新对象的...
  • 用指针交换和交换地址的区别

    千次阅读 2018-01-15 09:47:03
    指针的理解:内存是我们程序运行时候数据暂存的地方,内存是有大小的,我们可以把内存想象成一个连在一起的房间,每个房间都有自己的房间号,这个房间号就是我们内存中每个字节的“地址“,我们可以根据这个房间号来...
  • 在C语言中,我们常常用到的一个运算是让某个变量的+1. 例如 M = M + 1。 而在实际运用中,我们发现 对于指针进行+1运算,算出来的结果是+4。 如下图 图中我们定义的 变量M 和指针Matrix如下: int M = ...
  • #include #include using namespace std; int main(){ char c[3]={'a','b','c'}; char *p=c; cout cout(p+1) cout(p+2) system("pause");...若要打印地址请用void*,否则 p会被认为是字符串。
  • gdb查看内存地址和栈中的

    万次阅读 2016-05-17 15:50:31
    gdb查看指定地址的内存地址:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u...
  • 形参与实参&传递和地址传递

    万次阅读 2017-06-23 16:40:27
    2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的,以便把这些传送给形参。因此应预先用赋值,输入等办法使参数获得确定。 3、实参和形参在数量上,...
  • Java传递参数有两种方式:传递和引用传递 传递是传递数据:如基本数据类型都是传递 引用传递是把形参和实参的指针指向了堆中的同一对象,对象的引用和数组的引用。 实参,Java的基本数据类型,如int,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,925,159
精华内容 1,170,063
关键字:

地址值