• 关于 指针操作 的搜索结果

回答

指针的本意是:在一个变量中保存另一个变量的地址,以提供将“地址”变量化的能力。如果没有指针,将无法用一个变量引用另一个变量(只能把变量的值拷贝一份赋给另一个变量)。C语言中提供了完善的指针操作,包括为指针赋值、内存分配(malloc)、取变量地址、让指针可以参与运算等,这使得C程序员能够任意操作可用内存。Java(Javascript)中也有指针,只不过与C相比,Java对程序员使用指针有着严格的限制,仅允许赋值操作,而且不是任意值,只能是通过new创建的对象引用或其他引用变量的值。不过Java一般不说指针,而是用引用(reference)来称呼指向对象的指针,不过,Java中仍然可以找到一些指针存在的影子,例如,当一个对象为null时调用方法会导致null pointer异常,即所谓的空指针错误,可见Java内部使用的确实是指针。很多基本的数据结构,例如链表、树、图等,都必须用指针来保存前驱或后继节点的地址,否则这些数据结构无法实现。如果一个语言不提供指针,虽然在理论上它也具备完整的计算能力,但很多在其他语言中非常简单的问题都将变得极其复杂(本来想举个例子的,但一时想不起了,不过这个结论肯定是正确的)。所以这个作者说的是对的,只是你需要理解指针的本质,不要错误地认为只有像C语言那样的指针才叫指针,真正的指针的概念请看我开头的那句。

a123456678 2019-12-02 02:41:19 0 浏览量 回答数 0

回答

内置函数operator+可以将指针类型作为其操作数,因此将数组传递s给它会导致数组到指针的转换,然后int*返回指针。这意味着您可能会+s单独使用以获取指针。(在这种情况下,它是多余的;没有operator+它,它也会衰减到指针,然后分配给p。) (强调我的) 内置的一元加运算符返回其操作数的值。它不是空操作的唯一情况是操作数具有整数类型或无作用域枚举类型(通过整数提升来更改),例如,将char转换为int或如果操作数受左值到右值的约束,数组到指针或函数到指针的转换

保持可爱mmm 2020-02-09 13:16:36 0 浏览量 回答数 0

回答

不知道你对指针与指针,折腾啥异或操作,能说说道理吗。指针的与,或,经常用,不过那是指针和整型的玩。段错误,指针越界,跨平台不安全性。。。

杨冬芳 2019-12-02 02:59:49 0 浏览量 回答数 0

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

回答

快慢指针算法。 对于这个问题我们可以采用“快慢指针”的方法。就是有两个指针fast和slow,开始的时候两个指针都指向链表头head,然后在每一步 操作中slow向前走一步即:slow = slow->next,而fast每一步向前两步即:fast = fast->next->next。 由于fast要比slow移动的快,如果有环,fast一定会先进入环,而slow后进入环。当两个指针都进入环之后,经过一定步的操作之后 二者一定能够在环上相遇。

山林野人 2019-12-02 01:50:33 0 浏览量 回答数 0

回答

第一段程序你结构体指针没初始化, b根本就是的野指针嘛, 你程序能运行时因为野指针恰好没影响到程序的运行;第二段函数中返回结构体指针, main函数若是处理该给指针就属于越界操作.你通过malloc创建结构体, 会在内存中段空间就开辟了这段内存. 只要你没有free 这段内存就会一直存在, 因此在mian中访问该指针是合法的.

a123456678 2019-12-02 02:39:11 0 浏览量 回答数 0

回答

C语言里int a[10]的话,a是一个指针指向a[0]的指针C语言里int a2的话,a[0]是一个指向a0的指针,a[1]是一个指向a1的指针在你的代码里,int a2 *a指向a0这个inta指向a[0] = {1, 2, 3}这个array。只不过在C里面,array的地址就是array第一个元素的地址,所以在这里a = a[0] = a0a是*int[3]的指针,对其进行+1操作,内存指针往后移动sizeof(int[3])个位置*a是int指针,对其进行+1操作,内存指针往后移动sizeof(int)个位置你可以运行下面代码测试下 #include<stdio.h> int main(){ int a[2][3] = { {1, 2, 3}, {4, 5, 6} }; printf("%p\n", a); printf("%p\n", a+1); printf("%p\n", (*a+1)); return 0; }

西秦说云 2019-12-02 02:34:42 0 浏览量 回答数 0

回答

java飘过,用过JNA,int 和指针都是32位的。SO......######指针里面存的就是一个内存地址,内存地址就可以用一个整数来表示。so……c忘光了######指针是一个地址,而且是32位,和int类型一样,在机器中表现的就是一个“数字”而已######太官方啦,有木有别的解释, return (void* )1 是什么意思,这个1代表什么?内存?######(void ) -1 代表什么意思?  ######(void)-1 表示把-1转换为一个无类型指针,这个指针存储的值就是-1. 看看关于C和指针方面的书,这都是比较基础的######void代表的是void type而不是void value######都是void了怎么还能存-1呢?######哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。###### 引用来自“中山野鬼”的答案 哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> struct stu                            //我自己定义的学生结构 { char name[20]; int age; }; void* thr_fn1(void* arg)                //线程thr_fn1 {    printf("thread 1 exiting\n");     printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员    //((char*)arg)[20], ((int*)arg)[5] 用这样也可以读name , age return (void* )1; }     int main(void) 42 { 43 struct stu ones; 44 struct stu* pones = &ones; 45 memcpy(ones.name, "sgc", 4); 46 ones.age =10; 47 48 pthread_t tid; 49 void* tret; 50 pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 51 pthread_join(tid, &tret);                             //等待线程1结束        return 0;   } 我又不懂, void* 的一般用法有哪些,都在什么地方用? ###### 引用来自“gcshang”的答案 引用来自“中山野鬼”的答案 哈。首先要明确,机器处理的对象就是数字。当然不同位宽的数字有不同的辅助操作。而核心操作基本上就是加(减),乘,位操作,和取址操作。比较操作其实可以等同为减操作。 除非有硬件除法器,否则是没有除的概念。除法是调用系统库运算的结果。 由于核心操作都一样,所以不同类型,无非是位宽和核心操作前辅助操作的差异而已。 高级语言是为了方便你,帮你约束各个位宽,而落在机器上没有本质差异。 指针类型,无论指向的地址类型是什么 ,都是一个类型,就是“指针”类型。这个和机器的地址宽度有关。有时不和总线地址宽度有关,主要看CPU内部怎么处理了。但对于一个具体平台和OS,指针类型的位宽都是一致的。 需要注意的是,只有int和指针类型的位宽相同时,强制的转换才没有问题。否则还是会报错。int不等于指针类型的位宽。只是碰巧32位如此。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> struct stu                            //我自己定义的学生结构 { char name[20]; int age; }; void* thr_fn1(void* arg)                //线程thr_fn1 {    printf("thread 1 exiting\n");     printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员    //((char*)arg)[20], ((int*)arg)[5] 用这样也可以读name , age return (void* )1; }     int main(void) 42 { 43 struct stu ones; 44 struct stu* pones = &ones; 45 memcpy(ones.name, "sgc", 4); 46 ones.age =10; 47 48 pthread_t tid; 49 void* tret; 50 pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 51 pthread_join(tid, &tret);                             //等待线程1结束        return 0;   } 我又不懂, void* 的一般用法有哪些,都在什么地方用? void 只要你觉得这个不知道啥类型 你就可以用void ###### 引用来自“小耶果”的答案 (void*)-1 表示把-1转换为一个无类型指针,这个指针存储的值就是-1. 看看关于C和指针方面的书,这都是比较基础的  #include <stdio.h> 02    #include <stdlib.h> 03    #include <pthread.h> 04    #include <unistd.h> 05    #include <string.h> 06      07    struct stu                            //我自己定义的学生结构 08    { 09        char name[20]; 10        int age; 11    }; 12    void* thr_fn1(void* arg)                //线程thr_fn1 13    { 14      15        printf("thread 1 exiting\n"); 16        printf("%d\n", ((struct stu*)arg)->age);        //把void* arg准换为结构体的指针,取出age成员 17      18       //((char*)arg)[20], ((int*)arg)[5]  用这样也可以读name , age 19       return (void* )1; 20      21    } 22        int main(void) 23     { 24         struct stu ones; 25         struct stu* pones = &ones; 26         memcpy(ones.name, "sgc", 4); 27         ones.age =10; 28      29         pthread_t tid; 30         void* tret; 31         pthread_create(&tid, NULL, thr_fn1, (void*)pones);    //创建线程1,传入结构体的指针并转换为void* 32         pthread_join(tid, &tret);                             //等待线程1结束 33     } 你看我把指向结构体的指针pones转换为void*传入到线程thr_fn1的函数中,然后再函数中把void* 的指针转换为 结构体指针,然后访问结构体成员是否有问题?void*的典型用法是怎样的 ?

kun坤 2020-05-29 11:40:27 0 浏览量 回答数 0

回答

你给的例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

a123456678 2019-12-02 03:12:50 0 浏览量 回答数 0

问题

对一段内存调用free()函数后发生了什么?

a123456678 2019-12-01 20:12:03 1268 浏览量 回答数 2

回答

因为楼主基类的display函数不是虚函数C++重要性质:1、如果你以一个"基类之指针"指向一个"派生类之对象",那么经由该指针你只能调用该基类所定义的函数2、如果你以一个“派生类之指针”指向一个“基类之对象”,你必须先做明显的转型操作(explicit cast),这种作法很危险。B b = (B)&A_obj;3、如果基类和派生类都定义了“相同名称之函数”,那么通过对象指针调用成员函数时,到底调用了那个函数,必须视该指针的原始类型(B)而定,而不是视指针实际所指的对象的类型而定,这与第1点其实意义相通

a123456678 2019-12-02 02:01:46 0 浏览量 回答数 0

回答

const char *str1 = "abcd";这个语句在内存中分配了一块静态内存存储字符数组,然后把该字符数组的首地址赋予指针str1,这里的str1是一个指针,用sizeof操作符对其操作时,返回的是该指针的大小。char str2[5] = "abcd";这个语句在栈内存中分配了一块内存存储字符数组,然后把该字符数组的首地址赋予str2,标识该数组,用sizeof操作符对其操作时,返回的则是数组名str2所标识数组的元素个数。Update: 更正sizeof(type) sizeof expression 两个版本都返回一个size_t类型的常量。1) 返回 type 类型对应对象的大小(以字节为单位)。2) 返回 expression 的返回类型对应对象的大小(以字节为单位)。所以原来的回答有错误,现更正为: sizeof str1返回的是指针str1的字节大小,sizeof str2返回的是str2所标识数组的所有元素的字节大小。

a123456678 2019-12-02 02:36:54 0 浏览量 回答数 0

问题

C语言:进程间传递指针来实现数据操作是否会有安全隐患?

a123456678 2019-12-01 20:28:20 1042 浏览量 回答数 1

回答

_window直接操作了_window指针。 self.window调用了set方法来操作_window指针。

杨冬芳 2019-12-02 03:01:35 0 浏览量 回答数 0

回答

这里你要区分清楚指针数组和数组指针的概念。定义中 char *words[4]={"aaaa","bbbb","ccccc","dddd"} words是指针数组,分别指向不同字符串。words[2]是指向"cccc"的指针,但是是数组指针,即"cccc"是字符数组,words[2]指向了第一个字符的。固*(words[2])取值操作时,得到的是'c'。

xwaby 2019-12-02 02:41:20 0 浏览量 回答数 0

回答

a[]是一个包含5个元素的数组,a是指向该数组的首指针。而&a则是一个包含5个元素的数组的指针,所以&a的类型应该是 int ()[5],此时,你对&a做加一操作。指向的地址实际是a+5sizeof(int),此时实际已经是非法地址了,但是碰巧的是cout的时候,( (ptr -1)) 又将改指针做了减一操作,由于ptr是int ,该操作指向了合法地址,也就是数组的最后一个元素,所以输出了5. 由此可以说明,显示强制转换有时候是多么的粗鲁。当然,&(a +1)这个操作也是不合法的。因为C++11未实现之前,右值引用是不合法的。

a123456678 2019-12-02 02:44:15 0 浏览量 回答数 0

回答

DSI_REG->DSI_INTSTA.BUSYDSI_REG是某个类指针或结构体指针,这显然是个共享资源,其他地方也在操作这个指针,所以这个指针内部的成员有可能被改变。DSI_INTSTA是这个指针的一个成员变量,这个成语变量同样是结构体或类BUSY是DSI_INTSTA的成员变量。那个循环的意思很简单,就是只要这个BUSY不为假,就永远循环下去,即你的程序会卡在那不动。另外我上面也提到DSI_REG是某个共享资源,其他线程可能也会改变其内部值。所以某个时刻其他线程改了BUSY,使其为假,就跳出while,程序继续执行了。换句话说你这while意思就是只要忙,那就得等着,不忙,继续~下面那个while一个作用~

a123456678 2019-12-02 02:17:48 0 浏览量 回答数 0

回答

当然,使用指针应该首先初始化一个空地址的,否则,很容易发生指针地址错误其次,看了一下你的程序设计,程序本身是定义了一个array的结构体变量,在主函数中却要申请一个指针变量p(它的类型是结构体),一系列操作很繁琐出现错误也在所难免,建议你不要使用指针,只是用结构体变量就好了,PS:鉴于你的程序目的清晰,还可以换其他更简单的方式解决问题,复杂的结构是针对一些难以表述的问题设计的,用起来很难让人理解,简单明了的程序才最美。

a123456678 2019-12-02 02:15:34 0 浏览量 回答数 0

回答

"InputStream和Reader还支持如下几个方法来移动记录指针。 void mark(int readAheadLimit):在记录指针当前位置记录一个标记(mark)。 boolean markSupported():判断此输入流是否支持mark()操作,即是否支持记录标记。 void reset():将此流的记录指针重新定位到上一次记录标记(mark)的位置。 long skip(long n):记录指针向前移动n个字节/字符。"

星尘linger 2020-04-12 10:56:09 0 浏览量 回答数 0

回答

PHP 的数组指针操作函数: pos() 、end() 、prev()、next() 、each() 、reset()、current()foreach() 操作原始数组的一个拷贝,如果需要移动指针,使用 while 结构加上 each() 来实现。 $arr = array ('a', 'b', 'c', 'd', 'e'); reset($arr); while (list($k, $v) = each($arr)) { # 当前指针已经被指向了下一位 $curr = current($arr); echo "{$k} => {$v} -- {$curr}\n"; }

落地花开啦 2019-12-02 02:44:16 0 浏览量 回答数 0

回答

指针是一个概念,对于许多人而言,一开始可能会造成混淆,尤其是在围绕周围复制指针值并仍然引用同一内存块的时候。 我发现最好的类比是将指针视为一张纸,上面有一个房屋地址,并且它所引用的内存块就是实际的房屋。因此可以容易地解释各种操作。 我在下面添加了一些Delphi代码,并在适当的地方添加了一些注释。我之所以选择Delphi,是因为我的另一种主要编程语言C#不会以相同的方式展现诸如内存泄漏之类的东西。 如果仅希望学习指针的高级概念,则应忽略下面说明中标有“内存布局”的部分。它们旨在举例说明操作后的存储器外观,但是它们本质上是更底层的。但是,为了准确地解释缓冲区溢出是如何工作的,重要的是添加了这些图。

游客ufivfoddcd53c 2020-01-03 19:09:24 0 浏览量 回答数 0

回答

(((int *)((int )v1)) 是把v1当int的指针处理,在64位系统int是32位,地址是64位,所以(int)v1这个操作完成后值就已经错了,不能再当指针用了。(int)v1 是把v1当int*的类型处理,也就是先解出存放int的指针的地址,再解出int的值。星号被当排版用了,显示有问题。

西秦说云 2019-12-02 02:39:20 0 浏览量 回答数 0

问题

delete []如何知道它是一个数组?

保持可爱mmm 2020-02-07 13:07:37 9 浏览量 回答数 1

回答

以下文字摘自《C陷阱与缺陷》,写的非常好,很有必要摘录下来和大家一同分享。       C语言中的数组值得注意的地方有以下两点:       1.C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常熟确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真”出一个多维数组就不是一件难事。        2.对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标 进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。 ######可不可以理解这是广告###### 难掌握的是计算机体系 搞不懂指针的都是体系没学好的 ######国内好多数组和指针搞不清楚的教材害人呀。######明显广告######受益匪浅,对指针的看法有了更具体的认识,没那么抽象了。

kun坤 2020-06-09 19:20:10 0 浏览量 回答数 0

回答

这条线是最重要的: size = *(&a + 1) - a; 如您所见,它首先获取地址a并为其添加一个。然后,它取消引用该指针并a从中减去其原始值。 C语言中的指针算术使它返回数组或中元素的数量5。加1和&a是指向int之后5 秒的下一个数组的指针a。之后,此代码取消对结果指针的引用a,并从中减去(已衰减为指针的数组类型),从而得出数组中的元素数。 有关指针算法工作原理的详细信息: 假设你有一个指针xyz,它指向的int类型和包含的价值(int *)160。当从中减去任何数字时xyz,C表示从中减去的实际数量xyz是该数字乘以它所指向的类型的大小。例如,如果5从中减去xyz,则xyz结果的值将是xyz - (sizeof(*xyz) * 5)指针算术不适用的情况。 由于a是阵列5 int类型,得到的值将是5。然而,这与一个指针,只以与阵列将无法工作。如果您使用指针尝试此操作,结果将始终为1。 这是一个小示例,显示了地址以及地址的不确定性。左侧显示地址: a + 0 | [a[0]] | &a points to this a + 1 | [a[1]] a + 2 | [a[2]] a + 3 | [a[3]] a + 4 | [a[4]] | end of array a + 5 | [a[5]] | &a+1 points to this; accessing past array when dereferenced 这意味着代码正在a从中减去&a[5](或a+5),得到5。 请注意,这是未定义的行为,在任何情况下都不应使用。不要期望此行为在所有平台上都一致,也不要在生产程序中使用它。

保持可爱mmm 2020-02-07 01:24:10 0 浏览量 回答数 0

回答

在使用free()以后,指针的值没有变,但是指针所指向的地址的内容已经被标记为不可以使用,留作重新分配使用。使用malloc的时候,实际系统只是记录了你申请的空间大小,但没有真的分配足够的空间,当你真的使用这段申请的指针地址时,操作系统会产生一个错误,标示现在有需要申请一段可用的内存了new实际是在malloc的基础上申请了空间,并且初始化了这段空间,因此系统将这段内存已经实际创建完成了

a123456678 2019-12-02 02:02:25 0 浏览量 回答数 0

回答

对象的创建 说到对象的创建,首先让我们看看 Java 中提供的几种对象创建方式: Header解释使用new关键字调用了构造函数使用Class的newInstance方法调用了构造函数使用Constructor类的newInstance方法调用了构造函数使用clone方法没有调用构造函数使用反序列化没有带哦用构造函数 下面是对象创建的主要流程: 虚拟机遇到一条new指令时,先检查常量池是否已经加载相应的类,如果没有,必须先执行相应的类加载。类加载通过后,接下来分配内存。若Java堆中内存是绝对规整的,使用“指针碰撞“方式分配内存;如果不是规整的,就从空闲列表中分配,叫做”空闲列表“方式。划分内存时还需要考虑一个问题-并发,也有两种方式: CAS同步处理,或者本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。然后内存空间初始化操作,接着是做一些必要的对象设置(元信息、哈希码…),最后执行init方法。 为对象分配内存 类加载完成后,接着会在Java堆中划分一块内存分配给对象。内存分配根据Java堆是否规整,有两种方式: 指针碰撞:如果Java堆的内存是规整,即所有用过的内存放在一边,而空闲的的放在另一边。分配内存时将位于中间的指针指示器向空闲的内存移动一段与对象大小相等的距离,这样便完成分配内存工作。空闲列表:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对象,并在分配后更新列表记录。 选择哪种分配方式是由 Java 堆是否规整来决定的,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。 处理并发安全问题 对象的创建在虚拟机中是一个非常频繁的行为,哪怕只是修改一个指针所指向的位置,在并发情况下也是不安全的,可能出现正在给对象 A 分配内存,指针还没来得及修改,对象 B 又同时使用了原来的指针来分配内存的情况。解决这个问题有两种方案: 对分配内存空间的动作进行同步处理(采用 CAS + 失败重试来保障更新操作的原子性);把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在 Java 堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。哪个线程要分配内存,就在哪个线程的 TLAB 上分配。只有 TLAB 用完并分配新的 TLAB 时,才需要同步锁。通过-XX:+/-UserTLAB参数来设定虚拟机是否使用TLAB。 对象的访问定位 Java程序需要通过 JVM 栈上的引用访问堆中的具体对象。对象的访问方式取决于 JVM 虚拟机的实现。目前主流的访问方式有 句柄 和 直接指针 两种方式。 指针: 指向对象,代表一个对象在内存中的起始地址。 句柄: 可以理解为指向指针的指针,维护着对象的指针。句柄不直接指向对象,而是指向对象的指针(句柄不发生变化,指向固定内存地址),再由对象的指针指向对象的真实内存地址。 句柄访问 Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息,具体构造如下图所示: 优势:引用中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而引用本身不需要修改。 直接指针 如果使用直接指针访问,引用 中存储的直接就是对象地址,那么Java堆对象内部的布局中就必须考虑如何放置访问类型数据的相关信息。 优势:速度更快,节省了一次指针定位的时间开销。由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是非常可观的执行成本。HotSpot 中采用的就是这种方式。

剑曼红尘 2020-03-11 12:54:34 0 浏览量 回答数 0

问题

【算法】五分钟算法小知识:双指针技巧总结

游客ih62co2qqq5ww 2020-05-08 14:25:40 19 浏览量 回答数 1

回答

abcdefg是const不能直接加一 我想我知道了,字符串是const的对象所以指向他的指针也必须用const修饰,但这样又有个问题了char*p="ddd";为什么就可以呢?"ddd"不应该是一个const的的对象吗但指针并没有被const修饰啊 char*p="abcdefg"+1不会报错啊,倒是输出printf("%s",p)的时候,只会输出bcdefg。后面的加1操作相当于把p指针后移一位,你试一下看看 const是指常量的,怎么能用在指针上???const修饰后不是不能变了吗,指针还有什么用? 可以这样constchar*p=&i;i是什么p就是什么

爱吃鱼的程序员 2020-06-24 14:05:49 0 浏览量 回答数 0

问题

在C扩展模块中操作隐形指针

哦哦喔 2020-04-17 18:11:27 5 浏览量 回答数 1

回答

引用和指针是会同步的,如果是指拷贝就不会,因为你在工作现场里操作的是对象的一个拷贝,而非对象的本身。另外,你这种使用方式要注意是否线程安全,是否需要加锁 引用和指针是会同步的,如果是指拷贝就不会,因为你在工作现场里操作的是对象的一个拷贝,而非对象的本身。另外,你这种使用方式要注意是否线程安全,是否需要加锁

杨冬芳 2019-12-02 02:27:18 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播