如何在 C 中使用自引用结构



我正在学习C语言的自引用结构。以下代码中的错误是什么?我如何让它工作?

#include<stdio.h>
struct student
{
  char grade;
  struct student *ptr_dat;  //we have a pointer of datatype struct student.
};
int main()
{
  struct student data;
  struct student data1;
  data.grade = 'C';
  data1.grade = 'B';
  data.ptr_dat = &data1;  //the address of another structure is assigned. 
  /*
   print the element grade in both structures directly.
  */
  printf("%cn",data.grade);
  printf("%cn",data1.grade);
  /*
   how to print the element grade in data1 using pointer
  */
  printf("%cn",data.(*ptr_dat)); //This is error.
  return 0;
} 

提前谢谢。

简单的语法错误:你可以用data.ptr_dat->grade访问data1的成绩。

稍微扩展一下昆汀的答案...

为了访问结构实例的成员,您必须使用类似

struct-expression . member-name

其中struct-expressionstruct类型的表达式(例如结构名称datadata1(。 表达式的类型是成员的类型;因此,表达式data.grade的类型是chardata.ptr_dat的类型是struct student *(指向struct student的指针(。

所以,如果你想取消引用data.ptr_dat,你必须写*data.ptr_dat;IOW,您正在取消引用表达式data.ptr_dat 。 表达式被解析为*(data.ptr_dat),因为.成员选择运算符的优先级高于一元*运算符。

如果要访问指向struct 实例的成员,则应取消引用data.ptr_dat并使用 . 运算符:

printf( "%cn", (*data.ptr_dat).grade );

请记住,. 的优先级高于一元*,因此我们必须使用括号来确保我们取消引用的是data.ptr_dat,而不是data.ptr_dat.grade

这有点刺眼,所以 C 引入了一个替代成员选择运算符 ->. 希望其左侧操作数具有 struct 类型,而->运算符希望其左侧操作数具有指向struct类型的指针,因此您可以将上面的表达式编写为

printf( "%cn", data.ptr_dat->grade );

->运算符在访问grade之前隐式取消引用data.ptr_dat

如果您通过指针将一堆struct链接在一起,这将使生活更轻松。 给定以下代码:

struct student data1, data2, data3, *datap;
data2.ptr_dat = &data3;
data1.ptr_dat = &data2;
datap = &data1;

然后,以下所有表达式的计算结果都相同:

data3.grade 
data2.ptr_dat->grade
(*data2.ptr_dat).grade
data1.ptr_dat->ptr_dat->grade
(*data1.ptr_dat).ptr_dat->grade
(*(*data1.ptr_dat).ptr_dat).grade 
datap->ptr_dat->ptr_dat->grade 
(*datap).ptr_dat->ptr_dat->grade
(*(*datap).ptr_dat).ptr_dat->grade
(*(*(*datap).ptr_dat).ptr_dat).grade

最新更新