“你是怎么做的?”-&燃气轮机&引用;及"&引用;成员访问操作在C中有所不同

“你是怎么做的?”-&燃气轮机&引用;及"&引用;成员访问操作在C中有所不同,c,C,我查看了一些参考资料,告诉我->和是如何不同的,但它们似乎做了相同的事情。->是否像结构上的点运算符一样?访问对象的成员时使用点,通过指向对象的指针访问成员时使用箭头->指向结构指针,就像指向结构指针一样 struct Data data; data.content = 1; struct Data* pData = &data; pData->content = 2; 用于具有结构时,而->用于具有指向结构的指针时。箭头是取消指针引用然后使用:p->field与(*p)相同。

我查看了一些参考资料,告诉我
->
是如何不同的,但它们似乎做了相同的事情。
->
是否像结构上的点运算符一样?

访问对象的成员时使用点,通过指向对象的指针访问成员时使用箭头->指向结构指针,就像指向结构指针一样

struct Data data;
data.content = 1;

struct Data* pData = &data;
pData->content = 2;

用于具有结构时,而
->
用于具有指向结构的指针时。箭头是取消指针引用然后使用
p->field
(*p)相同。field

啊,我在查看区域设置时遇到了相同的问题。一个用于通过指针访问属性,另一个用于取消引用的结构:

#include <locale.h>

int main (void) {

    struct lconv *locale_ptr; 
    locale_ptr = localeconv();
    printf("Currency symbol: %s\n", (*locale_ptr).currency_symbol);
}

它们几乎是一样的东西。唯一的区别是“->”接受指向左侧结构的指针,“.”接受结构;“->”在访问结构成员之前遵循指针。所以

struct foo bar;
bar.x = 0;
同:

struct foo bar;
struct foo *diddly = &bar;
diddly->x = 0;

最简单的是你使用。在对结构本身进行操作时,->在对指向结构的指针进行操作时

struct Data data;
data.content = 1;

struct Data* pData = &data;
pData->content = 2;
要在代码中显示:

  struct s myStruct;
  myStruct.num = 5;
有效,但:

  struct s myStruct;
  myStruct->num = 5;
无效,因为myStruct不是指针

  struct s *myStruct;
  myStruct->num = 5;
这是有效的


->操作符实际上是(*myStruct).num

与许多其他语言不同,C语言允许变量将对象(此处为结构)作为值,并将指向对象的指针作为值。根据使用的变量类型,必须分别使用“.”或“->”。

[.]对结构的对象进行操作。一旦声明了特定结构的对象,[.]运算符就可以用于直接对成员进行操作

[->]对指向结构对象的指针进行操作。这是一个解引用运算符,专门用于指向具有成员的对象的指针。从而使我们能够访问引用对象的成员


根据声明,您可以使用这些运算符。

运算符a->b通常表示(*a).b。 因此,与“.”不同,它将取消引用它的第一个参数

在这一点上我可能是错的,但我的理解是它不是C的“正式”部分(你在问题中特别提到C)。C编译器是大多数C编译器厂商添加到C中的一个C++构造,但是,我必须承认,我没有跟上C的变化,所以我可能完全错了。
在C++中存在着进一步的差异。“->”运算符是可重载的,在这里,“.”不是。

两个都用在C++中访问类的成员。但是

  • 不可重载
  • 是可重载的
下面是一个示例,说明如何使用这两种方法:

#include<iostream>
class A {
   public: int b;
   A() { b = 5; }
};

int main() {
   A a = A();
   A* x = &a;
   std::cout << "a.b = " << a.b << "\n";
   std::cout << "x->b = " << x->b << "\n";
   return 0;
}

    
#包括
甲级{
公众:int b ;;
A(){b=5;}
};
int main(){
A=A();
A*x=&A;

STD:CUD<代码> ->代码>在K&R第一版本中,它一直是C++的一部分,当然是自从C++在BjARNE SoutruUp的眼睛中闪烁的时候。当然,<>代码> A- > B/<代码>是<>代码>(*A)的语法糖。B<代码>。在你的例子中,括号位于错误的地方。显示我所知道的“C”。“*”是o型。谢谢。值得一提的是,当你在一个结构中有指向其他结构的指针时,这真的很好。所以你有
a->b->c->d
,而不是
(*((*((*a.b)).c)).d