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

即使没有显式地将结构定义为指针,为什么还要使用->来访问结构成员变量呢?

即使没有显式地将结构定义为指针,使用->来访问结构成员变量的原因是因为通过指针访问结构成员变量可以避免对整个结构进行复制,提高了程序的效率。

当我们定义一个结构体变量时,可以通过直接使用"."来访问结构成员变量。例如,如果有一个结构体定义如下:

代码语言:txt
复制
struct Person {
    char name[20];
    int age;
};

我们可以通过以下方式访问结构成员变量:

代码语言:txt
复制
struct Person p;
p.age = 20;

然而,如果我们将结构体定义为指针类型,即:

代码语言:txt
复制
struct Person *p;

那么我们需要使用箭头运算符"->"来访问结构成员变量。例如:

代码语言:txt
复制
p->age = 20;

使用指针访问结构成员变量的好处是,当结构体较大时,通过指针访问可以避免对整个结构体进行复制,节省了内存和时间。此外,使用指针访问结构成员变量还可以方便地在函数之间传递结构体,避免了数据的拷贝。

在云计算领域中,使用指针访问结构成员变量的场景并不常见,因为云计算更多地涉及到分布式系统、虚拟化、容器化等技术。然而,在某些特定的情况下,可能会使用到结构体和指针的概念,例如在编写云原生应用程序时,可能会使用到结构体来表示配置信息或者状态信息,并通过指针来访问和修改这些信息。

腾讯云相关产品中与结构体和指针相关的内容较少,因此暂无相关推荐的产品和链接地址。

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

相关·内容

C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)

这个过程对用户(即程序员)来说是透明的,你不需要传递this指针或进行任何特殊的操作。编译器会自动处理这一切。...在C++中,编译器每个非静态成员函数隐传递一个名为this的指针,该指针指向调用该函数的对象。 这使得成员函数能够知道它们应该操作哪个对象的数据成员。这个过程对用户是透明的。...在成员函数内部,你可以通过 this 指针来访问或修改对象的成员变量。尽管在源代码中你并不会看到 this 指针的传递和使用,但编译器会在编译时你处理这些细节。 this指针可以为空吗?...然而,你不能 this 指针设置 nullptr 或其他无效地址,因为 this 指针是由编译器管理的,而不是由程序员直接控制的。...这是因为即使函数体内不直接访问任何成员变量成员函数被调用时仍然需要一个有效的 this 指针来作为上下文。当这个上下文不存在(即你试图通过一个空指针来调用成员函数)时,程序的行为就是未定义的。

9110

Go 结构体【Go语言圣经笔记】

如果结构没有任何成员的话就是空结构体,写作struct{}。它的大小0,也不包含任何信息,但是有时候依然是有价值的。...can't reference a, b var _ = p.T{1, 2} // compile error: can't reference a, b 虽然上面最后一行代码的编译错误信息中并没有提到未导出的成员...在本节中,我们看到如何使用Go语言提供的不同寻常的结构体嵌入机制让一个命名的结构体包含另一个结构体类型的匿名成员,这样就可以通过简单的点运算符x.f来访问匿名成员链中嵌套的x.d.e.f成员。...同时,因为成员的名字是由其类型隐决定的,所以匿名成员也有可见性的规则约束。在上面的例子中,Point和Circle匿名成员都是导出的。...但是为什么要嵌入一个没有任何子成员类型的匿名成员类型? 答案是匿名类型的方法集。简短的点运算符语法可以用于选择匿名成员嵌套的成员,也可以用于访问它们的方法。

37720

CC++开发基础——类对象与构造析构

访问类成员的方法: 用类的对象来访问:对象名.成员名 用类的指针来访问指针名->成员名 关于成员函数的内存空间: 基于同一个类创建的多个对象,该类的成员函数被多个对象所共享,即类的成员函数在多个对象之间只有一个副本...程序中没有定义任何构造函数时,编译器会提供默认构造函数。 当程序中已经一个类提供了非默认构造函数,就必须再定义一个不接受任何传参的默认构造函数。...在这种情况下,对象没有名称,但可以使用指针来管理该对象。...2.使用new、new[]分配空间。 3.使用智能指针分配空间。...该类的所有对象都可以访问这个静态成员变量。 静态成员变量可以作为类的特殊全局变量,它可以用来存储关于类的具体信息,比如当前类有多少个对象等。 该类即使没有被实例化为对象,它的静态成员变量依然存在。

23630

this指针的介绍和用法

需要说明: 这些都是编译系统自动实现的,编程序者不必人为在形参中增加this指针,也不必将对象a的地址传给this指针。在需要时也可以使用this指针。.../使用this指针 可以用*this表示被调用的成员函数所在的对象,*this就是this所指向的对象,即当前的对象。...this在非静态成员中有意义,作为右值可以直接在编译时确定其存在,运行时无所谓创建。 #2:this指针存放在何处? 堆,栈,全局变量,还是其他? 由上一问可知,this指针无需储存内存中。...#4:this指针如何访问类中变量的? 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量?如果你明白这一点的话,那就很好理解这个问题了。...而通常不去使用this指针来引用数据成员。同样也可以使用*this 来标识调用该成员函数的对象。

47920

C++学习知识点

使用const修饰的引用表示常引用,即引用的变量是常变量,这样一来,是防止在函数中对常引用的修改,多用于修饰类的常对象。如果值调用的形参声明为常量,则没有多大的使用价值。...(3)尽量基类的析构函数定义虚函数,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义虚函数时,只调用基类的析构函数。...为什么基类类型指针在被子类对象赋值后不能访问子类的成员函数?...(3) 执行重载的构造函数,初始化申明在栈上的类对象,直接申明,不要使用new,如GPR gpr= GPR(6),其中类GPR构造函数是GPR(int i){}; (4) new申明的是类指针,...(5) 申明类指针调用重载的构造函数,可以这样进行:GPR* gpr=new GPR(5); 13.

1.7K20

【C++】类与对象(上)

简单说就是,private是私有,他只能在自己的类中去使用,而public在内外都可以使用没有限制,这就更好的去使对象完善,方便内外去管理权限并使用。...5. class 的默认访问权限为 private , struct public( 因为 struct 要兼容 C)     这就是为什么,struct中,变量访问结构体中的值,可以随便访问...但是这里是有区别的,命名空间域相当于设置了一堵围墙,他里面的变量围了起来,只能通过域操作符来访问到里面变量,函数等,但是类的作用域(类域)它是一堵虚拟墙,他没有实体,就相当于加了密码锁的一张图纸,没有实质内容的...代码只保存一份,在对象中保存存放代码的地址 只保存成员变量成员函数存放在公共的代码段,只算成员变量成员函数不算空间 那么方案三不同于方案二的是,方案三没有函数地址放到类中。...,那么调用的就是同一个函数Print,那么为什么结果不相同??

35910

Go 语言面向对象教程 —— 类的定义、初始化和成员方法

类的定义和初始化 Go 语言的面向对象编程与我们之前所熟悉的 PHP、Java 那一套完全不同,没有 class、extends、implements之类的关键字和相应的概念,而是借助结构体来实现类的声明...,这个时候,函数就不再是普通的函数,而是类的成员方法了,然后可以在成员方法中,通过声明的类型变量来访问类的属性和其他方法(Go 语言不支持隐藏的 this 指针,所有的东西都是声明)。...: s *Student 这是因为 Go 语言面向对象编程不像 PHP、Java 那样支持隐的 this 指针,所有的东西都是声明的,在 GetXXX 方法中,由于不需要对类的成员变量进行修改,所以不需要传入指针...,而 SetXXX 方法需要在函数内部修改成员变量的值,并且作用到该函数作用域以外,所以需要传入指针类型(结构体是值类型,不是引用类型,所以需要传入指针)。...除了基于结构定义的自定义类之外,Go 语言还支持任何类型添加成员方法,包括基本类型,下一篇我们演示如何给前面数据类型系列中介绍的基本类型和复合类型添加成员方法,实现类似 Java 的「装箱」(boxing

6.7K30

C++之类和对象

(在C语言中是习惯先定义变量使用),但是一般我们见到的C++程序都是将成员函数写在成员变量的前面,这是为什么?...C++作为C语言的发展产物是兼容C语言的,因此struct关键字到了C++里不但可以继续用来定义结构体甚至还能定义类。但为什么大家更喜欢使用class来定义?...(默认成员函数:用户没有实现,编译器会生成的成员函数称为默认成员函数 ) 下面将对这六个默认成员函数进行讲解。...构造函数可以重载也支持缺省参数 如果类中没有定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,但一旦用户定义编译器将不再自动生成; 构造函数对内置类型不处理,对自定义类型调用自定义类型自身的默认构造...使用传值方式编译器直接报错,因为会引发无穷递归调用; 3.若未定义,编译器会生成默认的拷贝构造函数; 4.默认的拷贝构造函数对内置类型以字节单位直接进行拷贝 – 浅拷贝,对自定义类型调用其自身的拷贝构造函数

1.1K00

CC++面向对象编程之封装

在C++语言中,类也是一种构造类型,但是进行了一些扩展,可以类看做是结构体的升级版,类的成员不但可以是变量,还可以是函数;不同的是,通过结构定义出来的变量还是叫变量,而通过类定义出来的变量有了新的名称...可以看到结构体和对象的内存模型都是非常干净的,C语言里访问成员函数实际上是通过指向函数的指针变量来访问(相当于回调),那么C++编译器究竟是根据什么找到了成员函数?...实际上C++的编译代码的过程中,把成员函数最终编译成与对象无关的全局函数,如果函数体中没有成员变量,那问题就很简单,不用对函数做任何处理,直接调用即可。 如果成员函数中使用到了成员变量该怎么办?...成员变量的作用域不是全局,不经任何处理就无法在函数内部访问。 C++规定,编译成员函数时要额外添加一个this指针参数,把当前对象的指针传递进去,通过this指针来访问成员变量。...可以从这里看出来,只有类的源文件才能看到内部使用结构体,而掩码结构体是模块内外都可以看到的,简单来说,如果实际内部的定义外部的模块所能直接看见,那自然就没有办法起到保护作用。

91410

Go 复合数据类型之结构体与自定义类型

var book Book book.Title = "The Go Programming Language" book.Pages = 800 我们通过.来访问结构体的字段(成员变量),例如book.Title...3.3 使用顺序复合字面值初始化 对于我们前面的 Book 类型,确实不能设计零值可用类型,因为它们的零值并非有效值。对于这类类型,我们需要对它的变量进行的初始化后,才能正确使用。...在日常开发中,对结构体类型变量进行初始化的最常用方法就是使用复合字面值。...未出现在字面值中的结构体字段(比如上面例子中的 F5)采用它对应类型的零值。...那么整个结构体的对齐系数就是 8。 这个时候问题就来了!为什么上面的示意图还要结构体的尾部填充了 6 个字节

16420

Go 复合数据类型之结构体与自定义类型

var book Book book.Title = "The Go Programming Language" book.Pages = 800 我们通过.来访问结构体的字段(成员变量),例如book.Title...3.3 使用顺序复合字面值初始化 对于我们前面的 Book 类型,确实不能设计零值可用类型,因为它们的零值并非有效值。对于这类类型,我们需要对它的变量进行的初始化后,才能正确使用。...在日常开发中,对结构体类型变量进行初始化的最常用方法就是使用复合字面值。...未出现在字面值中的结构体字段(比如上面例子中的 F5)采用它对应类型的零值。...那么整个结构体的对齐系数就是 8。 这个时候问题就来了!为什么上面的示意图还要结构体的尾部填充了 6 个字节

19420

OOPC精要——撩开“对象”的神秘面纱

在C++语言中,类也是一种构造类型,但是进行了一些扩展,可以类看做是结构体的升级版,类的成员不但可以是变量,还可以是函数;不同的是,通过结构定义出来的变量还是叫变量,而通过类定义出来的变量有了新的名称...可以看到结构体和对象的内存模型都是非常干净的,C语言里访问成员函数实际上是通过指向函数的指针变量来访问(相当于回调),那么C++编译器究竟是根据什么找到了成员函数?...实际上C++的编译代码的过程中,把成员函数最终编译成与对象无关的全局函数,如果函数体中没有成员变量,那问题就很简单,不用对函数做任何处理,直接调用即可。 如果成员函数中使用到了成员变量该怎么办?...成员变量的作用域不是全局,不经任何处理就无法在函数内部访问。 C++规定,编译成员函数时要额外添加一个this指针参数,把当前对象的指针传递进去,通过this指针来访问成员变量。...可以从这里看出来,只有类的源文件才能看到内部使用结构体,而掩码结构体是模块内外都可以看到的,简单来说,如果实际内部的定义外部的模块所能直接看见,那自然就没有办法起到保护作用。

75310

类和对象 _ 剖析构造、析构与拷贝

一、构造函数 构造函数是特殊的成员函数,它在创建对象时自动调用。其主要作用是初始化对象的成员变量(不是开辟空间)。构造函数的名字必须与类名相同,且没有返回类型(即使是void也不行)。...这个默认构造函数不会执行任何操作,也不会初始化类的成员变量。这意味着,如果你的类Date没有定义任何构造函数,那么你可以创建一个Date对象而不提供任何参数,编译器会为你调用这个默认构造函数。...如何定义使用拷贝构造函数 定义 浅拷贝 浅拷贝只是简单复制对象的成员变量值,包括指针成员的地址,而不是复制指针所指向的内容。...所以我们在使用拷贝构造函数的时候要注意避免陷入无限循环: 形参使用引用方式 不在拷贝构造内进行拷贝构造 默认拷贝构造函数 当你没有定义一个拷贝构造函数时,C++编译器会自动生成一个默认的拷贝构造函数...默认的拷贝构造函数执行的是浅拷贝,即简单每个成员变量的值从原始对象复制到新对象中。

9710

C语言从入门到实战——联合体和枚举

联合体的大小取决于其中最大的成员的大小,共享同一块内存空间的成员可以存储不同类型的数据。 联合体的定义方式与结构体类似,使用关键字union,后跟联合体的名称。...联合体的成员可以是任意类型的变量,包括基本数据类型、数组、指针等。 使用联合体时,可以使用成员访问运算符".“或指针运算符”->"来访问联合体的成员。...你也可以枚举常量赋值,如下所示: enum Weekday { Monday = 1, Tuesday, Wednesday, Thursday, Friday,...使用赋值可以更准确控制枚举常量的值。 枚举在编程中常用于定义一组相关的常量,提高程序的可读性和维护性。...}; //计算连个变量的大小 printf("%d\n", sizeof(un)); return 0; } 为什么是4

7610

【c++】继承学习(一):继承机制与基类派生类转换

,但需要在派生类中能访问,就定义protected。...无法访问,因为_No是Student特有的成员即使它实际上存在于sobj中 即使我们通过基类引用或指针操作对象,派生类对象的完整信息(所有成员变量和函数)仍然都在内存中,没有丢失。...子类和父类中有同名成员,子类成员屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。...如果在派生类中尝试访问一个被隐藏的基类成员,需要使用类名限定符来指定基类的成员。在 Print 方法中使用 Person::_num 来访问基类 Person 中的 _num 成员。...,因为编译器认为我们试图调用 fun(int) 这个版本,但没有提供参数,导致参数不匹配 修复 为了调用基类 A 的 fun 函数,我们必须使用作用域解析运算符 :: 来指明我们想要调用的函数属于基类作用域

29310

嵌入笔试面试题目系列(二)

而malloc则需要地支持所需内存的大小。 3)new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性的操作符。...7、volatile作用和用法 一个定义volatile的变量是说这变量可能会被意想不到改变,这样,编译器就不会去假设这个变量的值了。...局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。关键字auto可以说明这个问题,但是局部变量默认为auto,所以没有必要声明为auto。...结构体struct内存对齐的3大规则: 1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型的整数倍; 2.结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐...如果使用结构体进行平台间的通信,会有问题。例如,发送消息的平台上,结构24字节,接受消息的平台上,此结构32字节(只是随便举个例子),那么每个变量对应的值就不对了。

64030

Linux内核第一宏

(TYPE)varlue; //值形式,如(type*)0; 定义使用了第二种语法,0值强制类型转换成一个TYPE结构体的指针。...这就是为什么定义中要通过强制类型转换结构体的地址变成0,举个例子:现在结构体的地址p=0,成员C的偏移量(offset)还是4,0+4=4,得到的结果正好就是该成员的偏移量了。...中,结构体的地址通过强制类型转换变成了0,我们知道0址是留给操作系统来使用的,这里面的内容是不允许普通的程序来访问的。...但是这里却结构体地址变成了0,那直接使用0址不会导致程序崩溃吗?...这里有一点值得思考的是:既然__mptr = (ptr),那为什么不直接使用传入的参数ptr去减,而是看似“多此一举”的在第二行ptr的值赋给 __mptr,然后用 __mptr去减

1.4K10

CC++刁钻问题各个击破之细说sizeof

其中类型包含基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量指针变量(包含void指针)。...或许你要问为什么,很好,学东西不能只知其然,还要知其所以然。我们知道声明变量的一个重要作用就是告诉编译器该变量需要多少存储空间。...为什么?问得好,我将尽全力对此作出解释:其实指针也是变量,只不过这个变量很特殊,它是存放其他变量的地址的变量。...结构体的大小跟结构成员对齐有密切关系,而并非简单等于各个成员的大小之和!比如对如下结构体两个结构体A、B使用sizeof的结果分别是:16,24。...你不能这样使用位域:floatf:8;这是不能通过编译的。并且位域变量不能在函数或者全局区定义,只能在结构体,自定义类,联合(union)中使用

77620

C++初阶 类和对象(上)

2.类的特点 相比于C语言中结构体的使用,类的使用更显特别,类的里面不止可以定义成员,还可以定义成员函数,更有趣的是它可以令部分内容私有,令部分内容公有。...为什么博主不直接定义a,b,c?...先说一个结论:类的计算是不包括this指针成员函数的,this指针等下会讲到。如何计算类的大小,有如下规则(把结构体换成类即可) (1) 第一个成员在与结构变量偏移量0的地址处。...VS中默认的值8 (3) 结构体总大小最大对齐数(每个成员变量都有一个对齐数)的整数倍。...7.this指针 学过C语言的同学看这个传递变量的过程一定会觉得怪怪的:为什么不用.或者->就能够修改结构体的成员变量(类),那是因为我们C++有一个隐藏的变量被传递过去了,那便是this指针,this

13510

.NET面试题系列 - C# 基础知识(1)

我们天天使用C#写程序,但如果连C#基础的东西都不懂,怎么证明你“熟悉C#”?怎么让人觉的你对C#有兴趣?...我们要看虚方法有没有被人重写,还要根据调用虚方法的对象(e)确定使用父类中的方法,还是子类中重写的方法。...当数组不用时,如果是使用结构体,则1000个对象马上销毁,如果是使用类,则还要等GC,无形中提升了GC压力。...它负责类型的实例字段初始化。对于静态字段,由静态构造函数负责。 如果类型没有定义任何构造函数,则编译器将定义一个没有参数的构造函数。其会简单调用基类的无参构造函数。...1.6.3 实例构造函数(结构结构体的构造函数必须初始化它的所有成员结构的构造函数不会被自动调用。 不能结构声明无参数的构造函数。

1.8K20
领券