我正在学习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-expression
是struct
类型的表达式(例如结构名称data
或data1
(。 表达式的类型是成员的类型;因此,表达式data.grade
的类型是char
,data.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