【C语言】结构体类型的定义与使用-创新互联

目录

创新互联建站-专业网站定制、快速模板网站建设、高性价比喀左网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式喀左网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖喀左地区。费用合理售后完善,十年实体公司更值得信赖。

一、结构体

二、结构体的定义

1.最基本的定义

2.有 typedef 的定义

3.定义即对象方式

4.定义即对象指针方式(涉及指针就会稍微复杂一点)

5. typedef结构体和结构体指针方式

三、结构体的使用


一、结构体

  结构体是用户自定义的一种类型,这种类型里面可以声明不同的数据类型,如char、int...等等,以此来满足用户对某种对象的数据描述。比如我想描述某个人的职业信息,那么通过描述他的姓名(char name[ ]),年龄(int),职业(char position[ ]),业绩(char),年薪( int )等就可以很清楚的知道这个的人的职业信息,当我需要把这个人的职业信息发给亲戚,总不能一句句发,而是全部整合到一起发,那么将多种数据类型整合到一起,我们可以使用结构体类型。

二、结构体的定义

结构体定义的方式有很多种:

1.最基本的定义
struct Person
{
    char name[16];
    int age;
};

  此定义,定义了一个Person结构体(记住是Person结构体,而不是叫结构体Person),意味着 struct Person才是结构体类型,struct叫做关键字,Person叫做标识符。因此,我们在使用的时候就得这样使用:

struct Person john;

这个Person结构体声明了一个对象,叫做 john。那么我们的某些编译器为了让我们节省打字压力,允许我们省略 struct 关键字:

Person john;

ps:这里Person没有变色是因为我们的结构体定义没有写进去,就写了一个声明对象。不是因为这种声明方式不可以哈(我的编译器是支持这种写法的)。但是这种写法在理论上来说是错误的(世上本没有路,走的人多了也就变成了路),如定义所说,这Person只是描述符,只有struct Person这种才代表了结构体类型,所以这种声明方式可以但不推荐大家这样写,以免对结构体定义有所混淆,那么如何正确省略struct这个关键字,看下面第2种定义。

2.有 typedef 的定义
typedef struct Person
{
    char name[16];
    int age;
}per;

这里的定义,用口语正确表达是:首先定义了一个struct Person的结构体,然后 typedef 关键字(这个关键字叫别定义)将 struct Person 别定义为 per。也就是说现在 per 就等价于 struct Person。那么就有如下声明:

per john;

  这样才是正确省略struct的方式。那么可以看出,用了 typedef 之后:

struct Person john;//正确,最原始的声明

per john;//正确,typedef的声明
struct per john;//错误,per = struct Person
3.定义即对象方式
struct Person
{
    char name[];
    int age;
}per;

  这种没有使用typedef的定义方式,叫定义即对象,也就是per就是struct Person的对象,相当于第2条中的 john。对于这种直接定义了对象的,可以重新使用如下声明第二个对象,也可以直接使用对象per:

struct Person john;//声明对象john

  那么这里的per,也是对象,是可以直接使用的,无需再重复声明了,如下使用

struct Person
{
    char name[16];
    int age;
}per;

int main()
{
    strcpy(per.name, "xiaoming");
    per.age = 16;
    printf("%s\n", per.name);
    printf("%d\n", per.age);

    return 0;
}
4.定义即对象指针方式(涉及指针就会稍微复杂一点)
struct Person
{
    char name[16];
    int age;
}*per;

int main()
{
    per = (Person*)malloc(sizeof(struct Person));
    strcpy(per->name, "xiaoming");
    per->age = 16;

    printf("%s\n", per->name);
    printf("%d\n", per->age);
    
    free(per);

    return 0;
}

  这种定义方式,和第3条有点类似,都是直接定义了Person结构体的对象,不过现在这个对象是个指针,所以per我们称为结构体指针。

  如果在定义时就声明了结构体指针,这指针是全局变量,存储在静态区,在整个程序结束后才会释放 *per 的内存(当然,要明白这个内存是存储的是 指针 本身即指针的地址,而不是数据成员name和age,现在这个指针的地址用了变量per表示, 这个 指针的变量per 的内容(值)是另一块内存的地址,即数据成员的首地址)。

  其次,在其他函数中(如main函数)欲使用 指针per 指向的数据成员,需要为数据成员开辟内存空间,使用malloc函数。这样 指针per(*per)指向的内存(数据成员的内存)就是存储在 堆 上,而非 栈(只存储局部变量) 上,也不是静态区(只存储静态变量和全局变量)。在使用完毕后,需要使用 free函数 手动释放存储在 堆 上的数据成员的内存空间。

5. typedef结构体和结构体指针方式
typedef struct Person
{
    char name[16];
    int age;
}per, *perptr;

int main()
{
    per a;
    a.age = 16;
    printf("%d\n", a.age);

    perptr v;
    v = (Person *)malloc(sizeof(struct Person));
    v->age = 14;
    printf("%d\n", v->age);
    free(v);

    return 0;
}

  看到这里,你就需要明白,既然用了typedef关键字,就代表 per 等价于 struct Person,*perptr 等价于 struct Person*(好好理解有typedef和没有typedef的区别,一个是结构体指针,一个是结构体对象指针)。既然是结构体指针,那么首先肯定要声明一个对象, perptr v;

三、结构体的使用

  结构体的使用其实在第二个里面有略微介绍到:主要就两种结构体和结构体指针的使用

typedef struct Base
{
    int a;
}base;

int main()
{
    //1.结构体
    base A;
    A.a = 11;
    printf("%d\n", A.a);

    //2.结构体指针
    base* B;
    B = (base*)malloc(sizeof(base));
    B->a = 12;
    printf("%d\n", B->a);
    free(B);

    //2.结构体赋值给结构体指针,即这个结构体指针指向另一个结构体 
    base* C;
    C = &A;
    printf("%d\n", C->a);
       
    return 0;
}

  那么结构体到此最基本的知识就已经讲完了------。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:【C语言】结构体类型的定义与使用-创新互联
分享地址:http://pwwzsj.com/article/coeegd.html