C

结构体的小知识

温故知新

Posted by 婷 on September 24, 2019 本文总阅读量

最近开始正式从头学数据结构,想起三四月的时候看过一点线性表的东西,突然想起了一些结构体的一些小知识,就回去翻了翻《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;

001.png

是不是很简单~

结构体的初始化

举个例子自己体会

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

同理当你在函数里面使用了一个结构体指针的话记得用箭头操作符

话不多说上图

002.png

在填入实参的时候记得取地址符号

003.png


参考书:《C与指针》

这本书真的挺不错的,后来遇到一些问题都是书中有提到的地方,回头重温一遍都有很多收获。