C/C++ 点和箭头操作符的区别

本文深入解析了在C++和C语言中,当I作为对象或指针时,如何通过.或->符号访问其成员变量。详细解释了结构体的应用和指针的特性。

原文地址:http://blog.sina.com.cn/s/blog_4a3da4ec010009gq.html

在c++中I如果是对象,就可以通过"."来调用I中的成员变量。

如果I是指针的话,就不能通过"."来调用,而只能使用"->"来调用。
在C语言中不存在对象的概念。
这种情况的出现是因为使用了结构,例如
struct CandyBar{
float weight;
int calorie;
};
在程序中
CandyBar snack={
2.3,
350
};
我们就可以用snack.weight来取得结构中的值。
这时是不能使用"->"来调用的,"->"符号指针对指针来说的。
如下情况可以使用"->"
CandyBar* bird;
bird->weight=2.33;
此时bird为一个CandyBar结构的地址指针。所以可以使用"->",而此时就不能使用
"."来操作。因为"." "相当于"对象的成员调用。
### 操作符箭头操作符区别 在C/C++中,操作符(`.`)箭头操作符(`->`)用于访问类或结构体的成员。两者的区别主要体现在它们的操作对象上。 #### 操作符(`.`) 操作符直接作用于对象本身,用于访问该对象的成员变量或成员函数。例如: ```cpp class A { public: int x; void print() { std::cout << "Value of x: " << x << std::endl; } }; A obj; obj.x = 10; // 使用操作符访问成员变量x obj.print(); // 使用操作符调用成员函数print ``` 上述代码中,`obj`是一个类`A`的对象,通过操作符访问其成员变量成员函数[^4]。 #### 箭头操作符(`->`) 箭头操作符作用于指向对象的指针,用于间接访问该对象的成员变量或成员函数。它等价于先对指针进行解引用(`*`),然后使用操作符访问成员。例如: ```cpp A* pObj = new A(); pObj->x = 20; // 使用箭头操作符访问成员变量x pObj->print(); // 使用箭头操作符调用成员函数print ``` 上述代码中,`pObj`是一个指向类`A`对象的指针,通过箭头操作符间接访问其成员变量成员函数。这等价于以下写法: ```cpp (*pObj).x = 20; // 显式解引用后使用操作符 (*pObj).print(); // 显式解引用后使用操作符 ``` #### 运算优先级 需要注意的是,操作符的优先级高于箭头操作符解引用操作符。因此,在某些复杂表达式中需要使用括号来明确操作顺序。例如: ```cpp Sales_item *sp = &item1; (*sp).same_isbn(item2); // 解引用后再使用操作符 sp->same_isbn(item2); // 等价于 (*sp).same_isbn(item2) ``` 如果省略括号,则可能导致编译错误或逻辑错误。 #### 自定义行为 在C++中,可以通过重载操作符来自定义操作符箭头操作符的行为。例如,箭头操作符可以被重载为返回一个指针,从而允许连续使用箭头操作符。例如: ```cpp class B { public: A a; A* operator->() { return &a; } }; B b; b->x = 30; // 实际上是调用了operator->返回的指针,再使用箭头操作符 ``` 上述代码中,`B`类重载了箭头操作符,返回指向内部成员`a`的指针[^2]。 #### 内存偏移量的应用 箭头操作符还可以用于计算内存中某个成员变量的偏移量。例如: ```cpp struct Vector3 { float x, y, z; }; int offset_x = (int)&((Vector3*)0)->x; // 计算x的偏移量 int offset_y = (int)&((Vector3*)0)->y; // 计算y的偏移量 int offset_z = (int)&((Vector3*)0)->z; // 计算z的偏移量 ``` 上述代码中,通过将空指针强制转换为`Vector3*`类型,并结合箭头操作符,可以获取成员变量在内存中的偏移位置[^3]。 ### 总结 - 操作符(`.`)直接作用于对象,用于访问其成员。 - 箭头操作符(`->`)作用于指向对象的指针,间接访问成员,等价于先解引用再使用操作符。 - 箭头操作符可以被重载以实现自定义行为。 - 在特定场景下,箭头操作符可用于计算成员变量的内存偏移量。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值