使用箭头运算符计算结构的 3 个成员的平均值,需要将点运算符转换为箭头

Posted

技术标签:

【中文标题】使用箭头运算符计算结构的 3 个成员的平均值,需要将点运算符转换为箭头【英文标题】:using arrow operator to calculate average of 3 members of a structure, need to convert from dot operator to arrow 【发布时间】:2022-01-18 09:05:05 【问题描述】:

我正在练习 c,我刚刚学会了如何分配整数和创建结构,我遇到了箭头运算符,我不知道如何应用它,我研究了一下,现在我知道 a->b 是与 (*a).b 相同,并且该箭头用于指针,我的问题是如何将此代码转换为使用箭头运算符,我尝试将成员从 int 更改为 int * 但它仍然不起作用。

#include <stdio.h>
#include <string.h>
struct student 
    char name[10];
    int chem_marks;
    int maths_marks;
    int phy_marks;
;
int main()

struct student ahmad;
struct student ali;
struct student abu_abbas;

strcpy (ahmad.name,"ahmad");
ahmad.chem_marks=25;
ahmad.maths_marks=50;
ahmad.phy_marks=90;

strcpy (ali.name,"ali");
ali.chem_marks=29;
ali.maths_marks=90;
ali.phy_marks=13;

strcpy (abu_abbas.name,"abu");
abu_abbas.chem_marks=50;
abu_abbas.maths_marks=12;
abu_abbas.phy_marks=80;

int ahmadavg=(ahmad.chem_marks+ahmad.maths_marks+ahmad.phy_marks)/3;
int aliavg=(ali.chem_marks+ali.maths_marks+ali.phy_marks)/3;
int abu_abbasavg=(abu_abbas.chem_marks+abu_abbas.maths_marks+abu_abbas.phy_marks)/3;


printf("%s  ",ahmad.name);
printf("average:%d\n",ahmadavg);
printf("%s ",ali.name);
printf("average:%d\n",aliavg);
printf("%s ",abu_abbas.name);;
printf("average:%d\n",abu_abbasavg);



【问题讨论】:

您没有在代码中使用指针,因此任何使用 -&gt; 运算符的尝试都是没有意义的(双关语不是有意的)。阅读学习材料中关于指针的章节。 您应该对使用mallocfree 的动态内存分配以及指针的一般工作方式进行一些研究。一个简单的例子是struct student *ahmad = malloc(sizeof(*ahmad); 然后在任何你使用ahmad.whatever 的地方,你现在都会使用ahmad-&gt;whatever,最后当你用完那个变量free(ahmad) 时。您可以将成员更改为指针,但您需要为它们分配内存并在完成后释放它。 “它不起作用”不是有用的问题描述,您遇到问题的代码不是您问题中的代码。 @RetiredNinja 谢谢你的帮助,我知道我的代码没有使用箭头运算符,我想知道如果它使用箭头运算符,这段代码会是什么样子,因为我知道这个概念在它后面,但我不知道它是如何应用的。 ut 你帮了我很大的忙,谢谢。 @Jabberwocky 我知道指针,因此我尝试将成员更改为指针,我接受了其他评论的建议并尝试在我的代码中实现它,但它并没有完全起作用,我的问题是,是否可以通过简单地将成员或结构更改为使用 * 而不是 malloc/free 的指针来使用箭头运算符,我仍然不知道它们是什么,并且需要对它们进行一些研究。 【参考方案1】:

这不是关于结构的成员是否是指针,而是关于拥有一个结构与一个指向结构的指针。

这个小例子应该很清楚:

#include <stdio.h>

struct Foo

  int a;
  int b;
;

int main()

  struct Foo f = 1,2;    // f is a structre

  struct Foo* pf;          // pf is a pointer to a struct Foo
                           // it points nowhere

  pf = &f;                 // now pf points to f

  printf("%d %d\n", f.a, f.b);         // direct access to f

  printf("%d %d\n", pf->a, pf->b);     // access via a pointer
  printf("%d %d\n", (*pf).a, (*pf).b); // access via a pointer (same as line above)

【讨论】:

感谢您的帮助

以上是关于使用箭头运算符计算结构的 3 个成员的平均值,需要将点运算符转换为箭头的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中结构体引用中箭头->与点.的区别

C++中不可重载5个运算符

C++list类模拟实现

运行时多态性 - 箭头运算符访问错误的成员?

均值滤波

C 语言结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )