[C]struct结构化数据的一些要点

1.用typedef声明一个短语代替冗长的struct成员声明

int main(void)
{

    typedef struct Hores Hores;
    struct Hores
    {
        int age;
        int height;
        char name[20];
        char father[20];
        char mother[20];
    };

    Hores groups[3];
}

2.成员之间的复制是按值传递的,并不是按引用传递

#include <stdio.h>
#include <string.h>
#include <stdarg.h>



int main(void)
{

    typedef struct Hores Hores;
    struct Hores
    {
        int age;
        int height;
        char name[20];
        char father[20];
        char mother[20];
    };

    Hores groups[3];

    strcpy(groups[0].name, "charleed");

    groups[1] = groups[0];


    printf("%d\n", sizeof(groups));

    printf("%s\n", groups[0].name);
    printf("%s\n", groups[1].name);
    strcpy(groups[1].name, "alex");
    printf("%s\n", groups[0].name);
    printf("%s\n", groups[1].name);

    return 0;
}

输出:

204

charleed

charleed

charleed

alex

3.访问结构成员有两种运算符:

   一个是“点运算符”,点运算符的左操作数一般是一个左值(也可以不是左值,但值必须是一个结构类型,参考左值一文的示例.5,或《C语言核心技术》第5章:结构和联合的成员);

   另一个是“箭头运算符”,箭头运算符的左操作数必须是一个指针;

 4.结构指针访问成员属性语法

printf("The name is %s\n", (*phorse).name);

为什么不是

printf("The name is %s\n", (*phorse.name));

因为成员选择运算符(句点)的优先级高于取消引用指针运算符*。这个操作还有另一种方法,更容易理解。将上面的语句改写为:

printf("The name is %s\n", phorse->name);

 5.结构成员必须都是完整类型,例如下面这个例子,如果成员是一个数组,而它不指定长度,就无法通过编译:

struct frame_1 {
    char name[];
};

不过有一个例外,就是C99允许:如果结构包含多个成员,那么最后一个成员允许为不完整类型的:

struct frame_1 {
    int index;
    char name[];
}

以上声明是合法的;

 

 

6.结构的成员可以包含一个还没有经过声明的结构指针,这种未经显式声明的结构指针被归类为不完整类型:

struct frame_1 {
    struct frame_2 *ptr_frame_2;
} item_1;

以上示例struct frame_2是一个未被声明的结构,它在这里被称为不完整类型;

 

7.机构成员的初始化规则是:

如果没有显式地初始化它们,就会采取一般的初始化规则:如果此结构对象属于动态存储类,那么其成员有不确定的初始化值。另一方面,如果结构对象具有静态生存周期,那么其成员初始化的值就是0,指针成员就是空指针。

posted @ 2019-12-22 16:50  yiyide266  阅读(341)  评论(0编辑  收藏  举报