• 结构体


    一、什么是结构体:


    数组:内部的元素是相同类型的。
    结构体:允许内部的元素是不同类型的。

    二、结构体的定义:


    1.定义形式:
    结构体内部的元素,也就是组成成分,我们一般称为"成员"。
    结构体的一般定义形式为:
    1 struct 结构体名{
    2
    3 类型名1 成员名1;
    4
    5 类型名2 成员名2;
    6
    7 ⋯⋯
    8
    9 类型名n 成员名n;   
    10
    11 };
    struct是关键字,是结构体类型的标志。
    2.举例:
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    };
    上面定义了一个叫做Student的结构体,共有name、age、height3个成员。
    呵呵,看到这里是否有点面向对象的味道呢,其实这跟面向对象完全是两码事,只能说感觉有点像。

    三、结构体变量的定义:


    1.先定义结构体类型,再定义变量:
    1 struct Student {
    2 char *name;
    3 int age;
    4 };
    5
    6 struct Student stu;
    第6行定义了一个结构体变量,变量名为stu。struct和Student是连着使用的。
    2.定义结构体类型的同时定义变量:
    struct Student {
    char *name;
    int age;
    } stu;
    结构体变量名为stu
    3.直接定义结构体类型变量,省略类型名:
    struct {
    char *name;
    int age;
    } stu;
    结构体变量名为stu

    四、结构体的注意点:


    1.不允许对结构体本身递归定义
    2.结构体内可以包含别的结构体
    1 struct Date {
    2 int year;
    3 int month;
    4 int day;
    5 };
    6
    7 struct Student {
    8 char *name;
    9 struct Date birthday;
    10 };
    3.定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
    1 struct Student {
    2 char *name;
    3 int age;
    4 };
    5
    6 struct Student stu;
    第1~4行并没有分配存储空间,当执行到第6行时,系统才会分配存储空间给stu变量。
    4.结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
    1 struct Student {
    2 char *name; // 姓名
    3 int age; // 年龄
    4 float height; // 身高
    5 };
    在16位编译器环境下,一个Student变量共占用内存:8 + 4 + 4 = 16字节。
    "补齐算法" 占用内存:8 + 8 + 8 = 24字节。(补齐现象不仅在结构体中有所体现,而且在其它地方也有所体现。)

    #include<stdio.h>
    int main()
    {
    struct Student
    {
    char *name;
    float height;
    int age;
    };
    struct Student stu = {"jack",3.5,30};
    int s = sizeof(stu);
    printf("%d ",s); //16 这种情况不补齐。
    return 0;
    }

    #include<stdio.h>
    int main()
    {
    struct Student
    {
    float height;
    char *name;
    int age;
    };
    struct Student stu = {3.5,"jack",30};
    int s = sizeof(stu);
    printf("%d ",s); //24 这种情况补齐。
    return 0;
    }

    #include<stdio.h>
    int main()
    {
    struct Student
    {
    float height;
    int age;
    char *name;
    };
    struct Student stu = {3.5,30,"jack"};
    int s = sizeof(stu);
    printf("%d ",s); //16 这种情况不补齐。
    return 0;
    }


    五、结构体的初始化


    1 struct Student {
    2 char *name;
    3 int age;
    4 };
    5
    6 struct Student stu = {"MJ", 27};
    只能在定义变量的同时进行初始化赋值,初始化赋值和变量的定义不能分开。

    六、结构体的使用:


    1.一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名
    1 struct Student {
    2 char *name;
    3 int age;
    4 };
    5
    6 struct Student stu;
    7
    8 // 访问stu的age成员
    9 stu.age = 27;
    第9行对结构体的age成员进行了赋值。"."称为成员运算符,它在所有运算符中优先级最高
    2.如果某个成员也是结构体变量,可以连续使用成员运算符"."访问最低一级成员
    1 struct Date {
    2 int year;
    3 int month;
    4 int day;
    5 };
    6
    7 struct Student {
    8 char *name;
    9 struct Date birthday;
    10 };
    11
    12 struct Student stu;
    13
    14 stu.birthday.year = 1986;
    15 stu.birthday.month = 9;
    16 stu.birthday.day = 10;
    3.相同类型的结构体变量之间可以进行整体赋值
    1 struct Student {
    2 char *name;
    3 int age;
    4 };
    5
    6 struct Student stu1 = {"MJ", 27};
    7
    8 // 将stu1直接赋值给stu2
    9 struct Student stu2 = stu1;
    10
    11 printf("age is %d", stu2.age);

    七、结构体数组:


    1.定义:跟结构体变量一样,结构体数组也有3种定义方式。

    struct Student {
    char *name;
    int age;
    };
    struct Student stu[5]; //定义1

    struct Student {
    char *name;
    int age;
    } stu[5]; //定义2

    struct {
    char *name;
    int age;
    } stu[5]; //定义3

    2.初始化:
    struct {
    char *name;
    int age;
    } stu[2] = { {"MJ", 27}, {"JJ", 30} };
    也可以用数组下标访问每一个结构体元素,跟普通数组的用法是一样的

    八、结构体作为函数参数:


    1 #include <stdio.h>
    2
    3 // 定义一个结构体
    4 struct Student {
    5 int age;
    6 };
    7
    8 void test(struct Student stu) {
    9 printf("修改前的形参:%d ", stu.age);
    10 // 修改实参中的age
    11 stu.age = 10;
    12
    13 printf("修改后的形参:%d ", stu.age);
    14 }
    15
    16 int main(int argc, const char * argv[]) {
    17
    18 struct Student stu = {30};
    19 printf("修改前的实参:%d ", stu.age);
    20
    21 // 调用test函数
    22 test(stu);
    23
    24
    25 printf("修改后的实参:%d ", stu.age);
    26 return 0;
    27 }

    九、指向结构体的指针:


    * 每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量
    * 结构体指针变量的定义形式:struct 结构体名称 *指针变量名
    * 有了指向结构体的指针,那么就有3种访问结构体成员的方式
    结构体变量名.成员名
    (*指针变量名).成员名
    指针变量名->成员名
    1 #include <stdio.h>
    2
    3 int main(int argc, const char * argv[]) {
    4 // 定义一个结构体类型
    5 struct Student {
    6 char *name;
    7 int age;
    8 };
    9
    10 // 定义一个结构体变量
    11 struct Student stu = {"MJ", 27};
    12
    13 // 定义一个指向结构体的指针变量
    14 struct Student *p;
    15
    16 // 指向结构体变量stu
    17 p = &stu;
    18
    19 /*
    20 这时候可以用3种方式访问结构体的成员
    21 */
    22 // 方式1:结构体变量名.成员名
    23 printf("name=%s, age = %d ", stu.name, stu.age);
    24
    25 // 方式2:(*指针变量名).成员名
    26 printf("name=%s, age = %d ", (*p).name, (*p).age);
    27
    28 // 方式3:指针变量名->成员名
    29 printf("name=%s, age = %d ", p->name, p->age);
    30
    31 return 0;
    32 }

  • 相关阅读:
    关于C++名字空间
    选择组合OR继承?
    编译器为C++ 空类自动生成的成员函数
    函数返回值为引用类型
    关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
    ADO.NET 安全编码指南 来自MSDN
    ADO.NET中调用存储过程
    视图
    高效使用连接的模式
    GROUP BY, HAVING, COMPUTE, ORDER BY 语句
  • 原文地址:https://www.cnblogs.com/tzktzk1/p/3329466.html
Copyright © 2020-2023  润新知