结构体
Suzhou 55 0
结构体类型的声明

用结构体描述对象时,结构体中包含了一些值,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。 ::: tip 结构声明:

struct tag
{
    member-list;
}variable-list;

struct:结构体关键字。 tag:结构体标签。(tag可以根据使用场景随意替换) struct-tag合称结构体类型。 member-list:成员列表,即结构体中的值的集合。 variable-list:变量列表。 ::: 定义一个学生结构体类型:

struct Stu  //结构体类型创建
{
    char name[20];
    char sex[5];
    short age;
    char tel[12];
}s1,s2,s3;  //

描述学生的一些数据如姓名等写在struct中,即成员变量。 ::: tip 结构体声明是一条语句,在声明结束时,在大括号后面加上分号做结尾。 结构体声明(创建)时不占据内存空间,使用结构体创建变量时才会占据内存空间。 ::: ::: warning 结构体声明中variable-list创建的变量是全局的结构体变量。 主函数中struct Stu创建的变量是局部的结构体变量。 在函数中应尽量少的使用全局变量,一般结构体变量在主函数中创建。 ::: 结构体创建的另一种写法:

typedef struct Stu
{
    char name[20];
    char sex[5];
    short age;
    char tel[12];
}Stu;  //结构体类型
int main()
{
    struct Stu s1;  //结构体类型创建变量
    Stu s2;  //创建变量
    return 0;
}

::: warning typedef表示把包含结构体关键字在内的整个结构体类型重新命名(将struct Stu改为Stu),新名字写在大括号结束后的分号前。 :::

结构体初始化

结构的成员可以是普通变量、数组、指针、其他结构体。 结构体变量在创建的同时对变量进行初始化称为结构体初始化。 结构体初始化:

typedef struct Stu
{
    char name[20];
    char sex[5];
    short age;
    char tel[12];
}Stu;
int main()
{
    struct Stu s1 = {"张三","男",25,"13866666666"};
    Stu s2 = {"李四","女",23,"13688888888"};
    return 0;
}
结构体成员访问

结构体变量访问成员时通过点操作符(.)访问。点操作符接受两个操作数。

struct S
{
    int a;
    char c;
    char arr[20];
    double b;
};
struct M
{
    char ch[10];
    struct S s;
    char* pc;
};
int main()
{
    char arr[] = "hello world";
    struct M m = { "hello",{10,'m',"hello word",3.14},arr};
    printf("%s\n", m.ch);
    printf("%s\n", m.s.arr);    
    printf("%lf\n", m.s.b);    
    printf("%d\n", m.s.a);
    printf("%s\n", m.pc);
    return 0;
}
hello
hello word
3.140000
10
hello world
结构体传参
typedef struct Stu
{
    char name[20];
    char sex[5];
    short age;
    char tel[12];
}Stu;

void Print1(Stu s)
{
    printf("name:%s\n", s.name);
    printf("tel:%s\n", s.tel);
}

void Print2(Stu* ps)  //结构体指针。如果前面没有使用typedef重命名,指针名为struct Stu*
{
    printf("name:%s\n", ps->name);
    printf("tel:%s\n", ps->tel);
}

int main()
{
    Stu s = {"李四","女",23,"13688888888"};
    Print1(s);
    Print2(&s);
    return 0;
}
name:李四
tel:13688888888
name:李四
tel:13688888888

上述代码中Print1是函数传值,Print是函数传址。 ::: warning 传址比传值更好。 传值时需要把实参s传递到到结构体中的形参stu中,形参是实参的临时拷贝,需要占用和实参一样大的空间,空间浪费严重,传参也需要更多的时间。 传址时只需要把地址传过去,只需要4个或8个字节。在函数中只需要创建一个4或8个字节的结构体指针变量来接收。整体系统开销小。 :::


压栈

结构体 结构体传参时,要把结构体的地址传过去。 结构体

评论区

索引目录