首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么'->‘运算符在指针指向指针的这种情况下不起作用?

在指针指向指针的情况下,'->'运算符无法直接使用是因为该运算符用于访问结构体或类指针所指向的成员变量或方法,而指针指向指针的情况下,并不直接指向结构体或类,无法通过'->'运算符进行成员访问。

指针指向指针的情况通常发生在多级指针的场景中,例如一个指针指向另一个指针,而该指针指向的是结构体或类。在这种情况下,需要使用多个'*'运算符进行解引用操作,逐级获取最终指向的结构体或类,并使用'.'运算符来访问其成员变量或方法。

举例来说,如果有一个指向指针的指针p,指向的是一个结构体structObj,可以通过以下方式获取结构体成员变量的值:

代码语言:txt
复制
(*(*p)).member

其中,第一个''用于解引用第一个指针,获取指向的指针;第二个''用于解引用第二个指针,获取指向的结构体;最后使用'.'运算符访问结构体的成员变量member

需要注意的是,为了简化这种多级指针的操作,可以使用中间变量简化代码,例如:

代码语言:txt
复制
struct StructType* p1 = *p;
struct StructType structObj = *p1;
structObj.member

以上是对指针指向指针的情况进行操作的方法,这样可以避免使用'->'运算符。至于使用指针指向指针的具体场景,常见的应用包括链表数据结构、动态多维数组、二叉树等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么无返回值的链表的插入操作头结点一定要用指向指针的指针

前言: 为什么链表的插入操作头结点一定要用指向指针的指针?之前自己对这个问题总是一知半解,今天终于花了点时间彻底搞懂了。 总的来说这样做的目的是为了应对“空链表”的情况。...比如下面的一段程序 1 // 链表的头指针为什么是指向指针的指针.cpp : 定义控制台应用程序的入口点。...这就是因为第20行直接将新节点的值赋值给Phead,导致出了insert函数后,Phead又变成了NULL结点,而没有达到想要的指向新结点的效果。...所以要把Phead设置成二级指针来传递或者在子函数中返回值才可以。...如果对上面红字还是不理解可以看下面程序 1 // 为什么链表的插入操作头结点一定要用指向指针的指针_延续.cpp : 定义控制台应用程序的入口点。

1.3K70

C++ this指针:用于在成员函数中指向调用该函数的对象

C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义的一个常量指针。它存储了当前对象的地址,可以通过它访问当前对象的成员变量和成员函数。...二、作为返回值的this指针 this指针可以作为返回值返回。这种情况下,返回的是指向调用该函数的对象的指针。为了实现这个功能,需要将返回类型设置为类的引用或指针类型。...函数内部,返回的是指向调用该函数的对象的指针。...这里使用了*this来访问调用该函数的对象。 三、作为函数参数的this指针 this指针也可以作为函数参数传递。这种情况下,可以在函数内部访问其他对象的成员变量和成员函数。

26140
  • C++ sizeof()运算符的参数为指针和数组的值为什么不同

    sizeof()的参数为指针和数组 C++或C语言中,都可以使用sizeof()运算符来计算数组的字节大小,除此之外,在C++和C语言中,都可以使用一个指向数组第一个元素的内存地址的指针来引用数组,因此...,如果要计算数组的字节大小,或长度,传递数组本身或传递指向数组的指针给sizeof()运算符似乎都是可以的,实际上则不然,二者有本质上的区别。...int n = sizeof(arr); // 定义一个指针指向数组arr int *p = arr; // 将指针p传递给sizeof() int m = sizeof...这是为什么呢? 不同值的原因 这主要是因为当sizeof()运算符的参数是数组本身,将计算的是数组的大小,而如果传递的是指针作为参数,那计算的便是指针的大小,而不是整个数组的。...来源:C++ sizeof()的参数为指针和数组的区别 免责声明:内容仅供参考,不保证正确性。

    18221

    struct 指向结构的指针,typedef 关键字,C++ 中的运算符重载,虚函数和纯虚函数,C++ 接口,#和##运算,c++线程

    指向结构的指针 指针的优点 a.为函数提供修改调用变元的灵活手段; b.支持C 动态分配子程序 c.可以改善某些子程序的效率 >>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构)...d.为动态数据结构(如二叉树、链表)提供支持 您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示: struct Books *struct_pointer; 现在,您可以在上述定义的指针变量中存储结构变量的地址...为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示: struct_pointer = &Book1; 为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:...在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。...下面是关于参数的说明: 参数 描述 thread 指向线程标识符指针。 attr 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。

    3900

    分享丨CC++内存管理详解--堆、栈

    他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。...编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。...杜绝“野指针” “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。...所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。...有了malloc/free为什么还要new/delete malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

    1.1K21

    对象引用和对象指针

    ptr 是一个指向对象的指针,而 *ptr 表示指针所指向的对象。因此,ptr 和 *ptr 的意思是不同的。 当你想通过指针访问对象的成员时,可以使用 -> 运算符。...为什么对象指针需要解引用,而对象引用就不需要 对象指针和对象引用的工作方式不同。对象指针存储的是对象的地址,而不是对象本身。...如果你想通过引用访问该对象的 x 成员,可以直接这样写: int a = ref.x; 为什么->运算符可以简化代码 -> 运算符是一种特殊的运算符,用于通过指针访问对象的成员。...如果你想通过指针访问该对象的 x 成员,可以这样写: int a = (*ptr).x; 但是这种写法比较繁琐,不够简洁。...C++风格 而C++程序员在“类型”中思考 int* pValue; 读取“pValue 的类型是指向 int 的指针”。 当然,编译器完全没有看到任何区别。

    7510

    C++之指针使用

    一 指针和数组对比   C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。...数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。...;    (2)不要在函数体内返回栈内存的指针 三 野指针   “野指针”不是NULL指针,是指向“垃圾”内存的指针。   ...人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。   “野指针”的成因主要有三种:   (1)指针变量没有被初始化。...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

    65210

    一篇读懂 C 指针

    不能简单的用“指针就是地址”来理解这里的指针。 第二个原因,数组和指针在很多情况下可以“互换”使用。...但在很多情况下,数组和指针又可以互换使用,这让初学者感到困惑,到底它们什么时候是相同的,什么时候必须严格区分不能混淆?数组和指针这种微妙的关系,是造成指针成为难点的另一个重要原因。...当数组名作为 sizeof 运算符的操作数时 在数组名作为 sizeof 运算符的操作数的情况下,将数组名解读为指针这一规则是无效的,在这种情况下返回的是数组整体的长度。...数组,就不会触发这种特殊处理: 1 char *str = "abc"; 在这种情况下,"abc" 是一个 char 数组,因为它出现在表达式中,所以会被解释为指向该数组首元素的指针,进而被赋值给...通过初始化列表确定数组长度的情况 编译器可以根据初始化列表推导出数组的长度,因此在这种情况下,最外层数组的元素个数可以省略。

    13410

    初级程序员面试不靠谱指南(六)

    再通俗一点,如果我在某一个函数中使用f()调用一个函数,这样也就是我采用这样一个运算符来进行一种计算,这种“计算”是调用函数,虽然()并不是一种单目运算符,但是为了这个问题更加简单,采用这样一种形式,目的是想强调...,这也就是为什么函数指针的声明形式看起来那么别扭的原因。...你会发现,如果你运气比较好的话,可以通过编译,但是我相信绝大数情况下,你会接到报错的消息,不过至少你领悟到了一个道理,和所有整数,浮点数等等一样,函数在程序中也是有一个地址的,虽然你不知道这是怎样一个形式...为什么函数指针不能随便指向一个函数呢?只是因为"函数"和"整数"这两个概念是不同的,虽然都带有"数",但是就像不是所有的鸟都能飞一样,不是所有的带有数的东西都是一类。...这种情况下,回到1里面说过的,对于一个函数指针,你可以分成两个部分来看待它,将int 和()看做指向的部分,(*f)看做指针的部分,如果你想声明指向一个“返回值为int并且带有一个int参数的函数”的指针

    699100

    深入理解js数据类型与堆栈内存

    对堆这种数据结构不了解的开发者,请移步我的另外两篇文章:数据结构:堆、实现二叉堆 通常情况下,我们所说的 堆 数据结构指的是 二叉堆 ,我们来回顾下二叉堆的特点: 它是一颗完全二叉树 二叉堆不是最小堆就是最大堆...引用数据类型存储在堆内存中,引用数据类型占据空间大、大小不固定,如果存储在栈中,将影响程序的运行性能。 引用数据类型会在栈中存储一个指针,这个指针指向堆内存空间中该实体的起始地址。...,指针指向的对象放在堆内存中 let msgObj = {msg: "测试", id: 5}; // 数组的指针存放在栈内存中,指针指向的数组存放在堆内存中 let ages = [19, 22, 57...,值存在堆内存 它们的值指向同一块堆内存,栈内存中会复制一份相同的引用 我们画个图来描述下: image-20210323213720148 深拷贝与浅拷贝 通过上述章节的学习,我们了解到引用数据类型在复制时...在实际开发中,我们希望引用类型复制到新的变量后,二者是独立的,不会因为一个的改变而影响到另一个。这种拷贝方式就称为深拷贝。

    70640

    指针与引用相关面试题

    1.指针和引用的差别? 非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向一个对象。不存在指向空值的引用这个事实意味着使用引用的代码效率会更高。 合法性区别。...在使用引用之前不需要检测它的合法性。相反,指针则应该总是被测试,防止其为空。 可修改区别。指针和引用的一个重要区别是指针可以被重新赋值以指向另一个不同的对象。...但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的其内容可以修改。 应用区别。在以下情况应该使用指针:一是考虑到存在不指向任何对象的可能,二是需要能够在不同的·时刻指向不同的对象。...这时它就是一个迷途指针。 使用迷途指针或空指针是非法的,而且有可能会造成程序奔溃。 C++中有了malloc/free,为什么还需要new/delete?...因此C++语言需要将一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。new/delete不是库函数而是运算符。

    32250

    CC++面试常问题集(2)

    三,赋值运算符重载函数  赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。 7、基类的析构函数为什么要用virtual虚析构函数?...那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。...在C++,有五种函数不能被声明成虚函数,分别是:非成员函数、构造函数、静态成员函数、内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数。 1....(2)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。...是C++的运算符; 对于非内部数据类型的对象(自己声明的类对象)而言,光用maloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc

    1.2K10

    娓娓道来c指针 (3)指针和数组「建议收藏」

    (3)指针和数组 在c中指针和数组似乎有着千丝万缕的关系。事实上它们不是一回事:指针是指针,数组是数组。两者不同样。...本质是:数组名是一个指向数组起始元素的常量指针。这也是数组和指针的唯一联系! 之所以能够使用 p[i] 来訪问数组中的元素,是由于在编译器中 p[i] 被解释为 *(p+i),这仍然是指针的功能。...至少对于编译器来说,[]这种运算符全然能够不存在。 但是对于人类来说。*(p+i)的写法在解读上比較困难,写起来也麻烦(键入量大)。因此,c语言引入[]运算符。 就像这样。...总结:仅仅有在函数形參中,仅有这一种情况,声明的数组。如 int array[]会被看作是指针。其他情况下,指针与数组并无联系。...至于数组、结构体和共用体这样将多个标量进行组合的类型,我们称之为聚合类型(aggregate)。 那么为什么int(*)[2]表示的是数组指针呢?这须要透彻理解c的声明语法。又比方。

    25630

    指针*和引用&的区别使用

    引用& 首先,&不是地址运算符,而是类型标识符的一种,就像*也不是指针运算符一样。 本篇偏向于&运算符。...&:可以叫它引用运算符 *:可以叫它解除指针运算符 就像char *意为指向char的指针一样,int&意为指向int 的引用。...栗子来一颗: int a; int &at = a; //上述声明允许将at和a互换,它们指向相同的值和内存单元,就像连体婴一样。 上面这个栗子其实很有内涵在里面 我为什么不写成下面这个形式呢?...int a; int &at; at = a; 在指针中是可以的,但是&不允许,&必须在声明时将其初始化。 引用经常被用作函数参数,使得函数中的变量名成为调用程序中变量的别名。...const. 4、函数指针 关于为什么要使用函数指针,我的理解还不是很深刻,毕竟功力不足。

    1.1K50

    由C语言过渡到C++的敲门砖

    为什么引用无法直接代替指针? 在链表中,节点就是指针,无法用指针替代。...因为我们要改变头指针的指向,所以用**p来接收头结点(修改一级指针的指向),然后再函数中就可以通过解引用进行修改头指针指向。而对于修改next指向本身是不用二级指针接收的。...在函数中直接通过修改phead的值就可以修改头结点的指向,而不需要像二级指针一样需要解引用才可以改变一级指针指向 。...• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。...为什么要加里面的分号? 如果使用宏 ADD(a++, b),没有括号的情况下,宏会展开成 a++ + b,这将导致 a 被递增两次:一次是因为宏展开,另一次是因为 a++ 本身。

    9810

    C++核心准则C.65:让移动操作对自赋值安全

    ISO标准只为标准库容易保证了一个“合法但未定义”的状态。看起来在10多年的经验和产品应用中没有成为问题。如果你遇到了反例请联系编辑。本规则更为谨慎并坚持做到完全安全。...move a pointer without a test (imagine it as code in the implementation a move assignment): 这里有一个不检查就移动指针的方法...这样就保证了自我移动时的安全。 这种做法太难理解了。...(中等)在自赋值的情况下,移动操作运算符应该避免对象的指针成员指向的对象被销毁或者该指针成员被置空。...(无法实施)找到使用标准库容器类型(包括string),认为它们在通常用途(不是声明周期敏感)时安全的。

    34620

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    可以看出,申请了八个字节,启动前4个字节是虚表指针,指向了虚表 后四个字节才是真正的为成员申请的内存....总结: 带有虚函数(虚关键字)的时候,内存中会把前4个字节当做虚表指针,并且在构造的时候初始化....看上面图可以知道,我们子类继承父类,并且填写了虚表指针为子类的,此时 则可以写成  父类指针指向子类   例如:  Myfather *pFa = new MyChild;  pfa指向的位置就是父类区域的起始位置...而且也说明了 为什么子类指针不能指向父类.这样会产生越界问题. 总结:   子类继承父类时候,有虚函数的时候,会先把头4字节申请出来填写为虚表指针, 而且会产生复写(重复写入)....比如我们熟悉的 1.数学中的中缀式   a + b / c - d * e 这种表达式就是中缀表达式 2.波兰式     -+a/bc*de  中缀转化为了波兰式,我们学习数据结构的树的时候就学习过这种方式

    1K90

    函数指针和指针函数的学习小结

    例如: char (*a[3])(int); a到底被声明为什么东东?指针?数组?还是函数? 分析时,从a 最接近(按运算符优先级)处开始。...有的书上或网上提供"向右看,向左看"的方法, 其实缺乏通用性, 比如它不适用于对多维数组本质的分析. 而且这种方法掩盖了本质....这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。 指针名和指针运算符外面的括号改变了默认的运算符优先级。...但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。 四、指向指针数组的指针 指针的指针另一用法旧处理指针数组。...具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。

    1.1K20

    【C++进阶学习】第十三弹——C++智能指针的深入解析

    本文将详细讲解C++中智能指针的概念、种类、使用方法以及注意事项。 一、引言 在正式讲解智能指针之前,我们先来了解一下为什么会诞生智能指针: 在C++中,指针是用于访问内存地址的一种特殊变量。...这种做法有两大好处: · 不需要显式地释放资源。 · 采用这种方式,对象所需的资源在其生命期内始终保持有效 智能指针是一种能够自动管理指针指向内存的类模板。...它通过重载解引用运算符(*)和箭头运算符(->)来模拟指针的行为,同时内部使用某种机制(RAII的原理)来自动释放内存。 总结一下智能指针的原理: 1. RAII特性 2....赋值:智能指针之间可以相互赋值,但std::unique_ptr不能赋值给std::shared_ptr。 解引用:使用解引用运算符(*)和箭头运算符(->)来访问智能指针指向的内存。...重置:使用reset方法来重置智能指针,释放当前指向的内存,并可以重新指向新的内存。 比较:智能指针之间可以使用比较运算符进行比较。

    12110
    领券