007+limou+C语言入门知识——(6)结构体

1、结构体的声明

结构体是一些类型的集合,通过这个结构体可以让用户自定义出一个变量类型

struct str
{
    int a;
    char b;
    double c;
};
int main()
{
    struct str s;//可以将struct str整体理解为一个变量类型
    return 0;
}

又例如描述一个人,创建一个“‘人’类型”

struct pep
{
    char name[10];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//身份证
};

2、结构体的初始化

可以像初始化数组一样初始化一个结构体

struct pep
{
    char name[10];//名字
    int age;//年龄
    char sex[5];//性别
    char id[100];//身份证
};
int main()
{
    struct pep p = { "limou", 13, "女", "4465667655453625" };
    return 0;
}

甚至可以嵌套初始化

struct grade
{
    int chinese;
    int math;
};
struct pep
{
    char name[10];//名字
    int age;//年龄
    char sex[5];//性别
    char id[100];//身份证
    struct grade a;
};
int main()
{
    struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
    return 0;
}

007+limou+C语言入门知识——(6)结构体_第1张图片

3、结构体成员访问
如果此时我们创建并初始化好一个结构体变量,那么我们应该怎么做才能访问其成员呢?

(1)采用“.”操作符

struct grade
{
    int chinese;
    int math;
};
struct pep
{
    char name[10];//名字
    int age;//年龄
    char sex[5];//性别
    char id[100];//身份证
    struct grade a;
};
int main()
{
    struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
    printf("%s\n", p.name);
    printf("%d\n", p.age);
    printf("%s\n", p.sex);
    printf("%s\n", p.id);
    printf("%d\n", p.a.chinese);
    printf("%d\n", p.a.math);
    return 0;
}

(2)采用“->”操作符

#include 
struct grade
{
    int chinese;
    int math;
};
struct pep
{
    char name[10];//名字
    int age;//年龄
    char sex[5];//性别
    char id[100];//身份证
    struct grade a;
};
int main()
{
    struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
    struct pep* pp = &p;
    printf("%s\n", pp->name);
    printf("%d\n", pp->age);
    printf("%s\n", pp->sex);
    printf("%s\n", pp->id);
    printf("%d\n", pp->a.chinese);
    printf("%d\n", pp->a.math);
    return 0;
}

4、结构体传参

结构体传参可以传递整个结构体(这是为了让结构体变量和普通的变量保持同步)或者结构体的地址

struct S 
{
    int data[1000];
    int num;
};
struct S s = {{1,2,3,4}, 1000};

//结构体传参
void print1(struct S s) 
{
    printf("%d\n", s.num);
}

//结构体地址传参
void print2(struct S* ps) 
{
    printf("%d\n", ps->num);
}
int main()
{
    print1(s);  //传结构体
    print2(&s); //传地址
    return 0; 
}

但如果结构体的大小比较大,一般会使用指针传参会更好(因为省内存,函数在传参的时候,参数是需要压栈的,如果传递一个结构体对象过大,则参数压栈的系统开销会比较大,导致程序性能下降)

你可能感兴趣的:(C语言学习笔记,c语言,算法,c++)