最近开始正式从头学数据结构,想起三四月的时候看过一点线性表的东西,突然想起了一些结构体的一些小知识,就回去翻了翻《C与指针》。
结构体的声明
结构体的形式如下
struct tag {member-list} variable-list
其中的tag
是标签,member-list
是成员变量,variable-list
是变量列表。
比如我下面依次声明了一个变量x
,数组y
,指针z
。
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}y[20];
struct
{
int a;
char b;
float c;
}*z;
是不是觉得你要声明一个结构体类型的变量是不是很麻烦
下面这种做法就相当的“一劳永逸”
struct simple
{
int a;
char b;
float c;
};
这个声明只提供了一个标签simple
,没有提供变量列表,也就是说并没有创造变量而已,但是你可以将标签simple
,拿去“创造变量”,就相当于把这个标签当成像int
,char
,float
,那样子去声明了~
struct simple x;
struct simple y[20];
struct simple * z;
虽然利用了标签去创造了变量真的方便了很多,但是是不是觉得每次要加个struct
很麻烦?还有另一种更“好用”的声明
typedef struct
{
int a;
char b;
float c;
}simple;
用typedef
的形式声明之后,声明变量我们就可以这样啦
simple x;
simple y[20];
simple * z;
是不是很简单~
结构体的初始化
举个例子自己体会
struct init_ex
{
int a;
short b[10];
simple c; /*simple是一个结构体的标签*/
}x={
10,
{1,2,3,4,5},
{25,'x',1.9}
};
结构体成员的直接访问
typedef struct
{
float f;
int a[20];
long *lp;
struct simple s;
struct simple sa[10];
struct simple * sp;
}complex;
比如我现在创建一个变量complex try
,然后我try.a
,用点操作符直接访问,这样子的结果是你可以把这个当成一个数组名,用在任何可以使用数组名的地方。同理,你也可以用点操作符这么操作try.sa[4].c
。
结构体成员的间接访问
还是上面的例子,如果现在我定义了一个指针呢,complex * sp
,我现在想访问结构体里面的变量f
,有两种方法。
-
(* cp).f (* cp).a (* cp).s
因为点操作的优先级高于间接访问操作符,所以必须要在表达式中用括号,确保间接访问首先执行
-
cp->f cp->a cp->s
同理当你在函数里面使用了一个结构体指针的话记得用箭头操作符
话不多说上图
在填入实参的时候记得取地址符号
参考书:《C与指针》
这本书真的挺不错的,后来遇到一些问题都是书中有提到的地方,回头重温一遍都有很多收获。