美文网首页
C语言结构体

C语言结构体

作者: AuglyXu | 来源:发表于2018-09-08 14:04 被阅读0次

结构体(Go语言重点)

  • 结构体时构造类型的一种
  • 构造类型前面我们已经学习过了数组:
  • 数组的作用是用于存储一组相同类型的数据

  • 结构体的作用是用于存储一组不同类型的数据

结构体类型的定义

  • struct 结构体类型名称{
    数据类型 属性名称;
    数据类型 属性名称;
    ... ...
    };

结构体变量的定义

  • 先定义结构体类型

  • 通过结构体的类型定义结构体变量

    • struct 结构体类型名称 变量名称;
    // 1.定义结构体类型
    struct Person{
        char *name; // name我们称之为结构体的属性名称
        int age; // age也称之为结构体的属性名
        double height; // height也称之为结构体的属性名称
    };
    // 2.定义结构体变量
    struct Person p;

    // 3.使用结构体变量
    // int ages[3] = {1, 3, 5};
    // ages[0] = 1;
    // 格式: 结构体变量名称.结构体属性名称
    p.name = "lnj";
    p.age = 35;
    p.height = 1.9;
    printf("name = %s\n", p.name);
    printf("age = %i\n", p.age);
    printf("height = %lf\n", p.height);

结构体变量初始化的几种方式

1.定义的同时初始化

struct Dog{
        char *name;
        int age;
        double height;
    };
struct Dog dd = {"ww", 1, 1.5};    
  • 注意点: 如果在定义的同时初始化, 那么初始化的顺序必须和结构体类型中的顺序一致
struct Dog dd = {.age = 1, .name = "ww", .height = 1.5};

2.先定义再初始化

struct Dog dd;
dd.name = "ww";
dd.age = 1;
dd.height = 1.5;

3.特殊的初始化方式

  • 数组只能在定义的同时完全初始化, 不能先定义再完全初始化
  • 但是结构体既可以在定义的同时完全初始化, 也可以先定义再完全初始化
// 企业开发不推荐这样编写
     struct Dog dd;
     dd = (struct Dog){"ww", 1, 1.5};

定义结构体变量的几种方式

  • 定义结构体变量的几种方式

1.先定义结构体类型, 再定义结构体变量

 struct Person{
        char *name;
        int age;
        double height;
    };
    struct Person p1;
    struct Person p11;

2.定义结构体类型的同时定义结构体变量

struct Person{
        char *name;
        int age;
        double height;
    } p2;

3.定义结构体类型的同时省略结构体名称, 同时定义结构体变量

struct{
        char *name;
        int age;
        double height;
    } p3;
    p3.name = "it666";

注意点:
匿名结构体特点: 结构体类型只能使用一次


结构体类型的作用域

  • 和变量的作用域一样
#include <stdio.h>

struct Person{
    char *name;
    int age;
    double height;
};
int main()
{
    /*
     * 结构体类型的作用域
     * 和变量的作用域一样
     */
    // 1.定义一个结构体类型
    {
//        struct Person{
//            char *name;
//            int age;
//            double height;
//        };
        struct Person p1;
    }
    struct Person p3;
    return 0;
}
void test(){
    // 找不到Person这个结构体类型
     struct Person p2;
}

结构体数组

  • 结构体数组
  • 定义个数组保存结构体变量
  • 格式: 数据类型 数组名称[元素个数];
 struct Person{
        char *name;
        int age;
        double height;
    };
 struct Person ps[4] ={
         {"lnj", 35, 1.90},
         {"zs", 22, 1.2},
         {"ls", 33, 1.4},
         {"ww", 56, 1.8},
     };

结构体内存分析

  • 注意点一:

1.给整个结构体变量分配存储空间和数组一样, 从内存地址比较大的开始分配

2.给结构体变量中的属性分配存储空间也和数组一样, 从所占用内存地址比较小的开始分配

  • 注意点二:

1.和数组不同的是, 数组名保存的就是数组首元素的地址

2.而结构体变量名称, 保存的不是结构体首属性的地址

 struct Person{
        int age;
        int score;
    };
struct Person p;
printf("p = %p\n", p); // p = 00000077
printf("&p = %p\n", &p); // &p = 0060FEA8
printf("&p.age = %p\n", &p.age); // &p.age = 0060FEA8
printf("&p.score = %p\n", &p.score); // &p.score = 0060FEAC
结构体内存分配的特殊性

1.结构体在分配内存的时候, 会做一个内存对齐的操作.会先获取所有属性中占用内存最大的属性的字节

2.再开辟最大属性字节的内存给第一个属性, 如果分配给第一个属性之后还能继续分配给第二个属性, 那么就继续分配

3.如果分配给第一个属性之后, 剩余的内存不够分配给第二个属性了, 那么会再次开辟最大属性直接的内存, 再次分配

以此类推



  • 通过以上两图就可以直观的看出结构体内存分配的原则

结构体指针

#include <stdio.h>

int main()
{
    /*
     * 结构体指针
     * 因为结构体变量也会分配内存空间, 所以结构体变量也有内存地址, 所以也可以使用指针保存结构体变量的地址
     *
     * 规律:
     * 定义指向结构体变量的指针的套路和过去定义指向普通变量的一样
     *
     * 如果指针指向了一个结构体变量, 那么访问结构体变量的属性就有3种方式
     * 结构体变量名称.属性名称;
     * (*结构体指针变量名称).属性名称;
     * 结构体指针变量名称->属性名称;
     */

    struct Person{
        char *name;
        int age;
        double height;
    };
    struct Person per = {"lnj", 35, 1.9};
    struct Person *p;
    p = &per;
    printf("per.name = %s\n", per.name);
    printf("per.name = %s\n", (*p).name);
    printf("per.name = %s\n", p->name);
    return 0;
}

结构体嵌套定义

  • 结构体的属性可以又是一个结构体,可以提高代码的复用性
 // 1.定义了一个日期的结构体类型
    struct Date{
        int year;
        int month;
        int day;
    };
    // 2.定义一个人的结构体类型
    struct Person{
        char *name;
        int age;
        struct Date birthday;
        struct Date graduate;
    };
    struct Person p = {"lnj", 35, {2020, 12, 12}};

    printf("name = %s\n", p.name);
    printf("name = %i\n", p.age);
    printf("name = %i\n", p.birthday.year);
    printf("name = %i\n", p.birthday.month);
    printf("name = %i\n", p.birthday.day);

结构体和函数

  • 虽然结构体时构造类型, 但是结构体变量之间的赋值和基本数据类型赋值一样, 是值拷贝
struct Person p1 = {"lnj", 35};
    printf("p1.name = %s\n", p1.name); // lnj
    test(p1);
    printf("p1.name = %s\n", p1.name); // lnj

void test(struct Person per){
    per.name = "zs";
}

相关文章

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • C语言结构体用法很多,坑也很多

    C语言可谓是编程界的传奇语言,历经几 十 年,依然排名前列。 本文主要说的是C语言中的结构体,结构体是C语言中重要...

  • C语言结构体

    结构体 本文介绍C语言结构体,struct 在C++中功能相对C较多,相当于类,这里暂时不讨论,本文单独讨论C语言...

  • 嵌入式学习笔记19.11.25

    c语言结构体 结构体一般定义全局变量 struct stu{//struct 定义结构体 stu 结构体名称 in...

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

  • C语言学习笔记-结构体占用内存大小的计算

    引言 结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的...

  • 结构体与指针

    1.1 Linux C语言结构体 简介:本课程深入的讲解了C语言中,预处理是怎么回事,结构体和公用体又是如何使用及...

  • c语言中的结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 闲聊C语言结构体

    结构体是 C 语言主要的自定义类型方案,这篇就来认识一下结构体。 一、结构体的形态 C源程序(struct.c):...

  • 深入理解Runtime中的isa

    objc_object Objective-C 所有对象都是 C 语言结构体objc_object,这个结构体中包...

网友评论

      本文标题:C语言结构体

      本文链接:https://www.haomeiwen.com/subject/oowkgftx.html