day12(C基础)结构体

结构体 struct

使用关键字:struct

定义:用户自定义的数据类型,在结构体中可以包含若干不同数据类型的成员变量(也可以相同),使这些数据项组合起来反映某一个信息

格式:

struct 结构体名

{

数据类型 成员变量名1;

数据类型 成员变量名2;

数据类型 成员变量名3;

....

}

结构体变量:

概念:使用结构体类型定义的变量的就是把结构体变量

格式:struct 结构体名 变量名;

定义方式:

1.定义结构体同时定义结构体变量

struct demo
{
    char name[32];
    int age;
    float score;
}dem1;


2.定义完成结构体后在定义变量:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
    char name[32];
    int age;
    float score;
};

int main()
{

struct demo dem1;
   return 0;
}

3.定义结构体时没有名称

struct 
{
    char name[32];
    int age;
    float score;
}d1;

赋值:

1.花括号按顺序赋值赋值

struct

{

char name[32];

int age;

float score;

}d1={"hello",10,1.9};

2.通过点的方式分开赋值

struct demo
{
    char name[32];
    int age;
    float score;
};

int main()
{
    struct demo dem1;
    dem1.age = 20;
    dem1.score = 1.99;
    }


3.通过大括号点等法赋值

struct demo
{
    char name[32];
    int age;
    float score;
};

int main()
{
    struct demo dem1 = {
        .age = 22,
        .name = "hello",
    };
printf("age=%d  name=%s\n",dem1.age,dem1.name);


访问:

输出:通过点的方式:结构体变量名.成员变量名

输入: 结构体变量名.成员变量名

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
    char name[32];
    int age;
    float score;
};

int main()
{
    struct demo dem1 ;
    scanf("%s",dem1.name);
    printf("name=%s\n",dem1.name);

    return 0;
}

重定义 typedef

语法:typedef 旧名称 新名称

typedef int size_t

typedef int*   intp

int* p====intp p

1.定义结构体的同时重定义

typedef struct demo
{
    char name[32];
    int age;
    float score;
}DM;

2.分开

    typedef struct demo DM;
    DM dem1;


​​​​​​​结构体数组

概念:结构体类型相同的变量组成的数组

定义格式:

1.定义结构体同时定义结构体数组

struct demo
{
    char name[32];
    int age;
    float score;
}Darr[3];

2.先定义结构体后定义结构体数组

  struct demo Darr[3];


初始化:

1.定义同时赋值

struct demo
{
    char name[32];
    int age;
    float score;
} arr[3] = {
    {"a", 20, 19.9},
    {"b", 23, 123.2},
    {"ab", 49, 20.1}};

3.先定义后每一个元素赋值

struct demo Darr[3];
    strcpy(Darr[0].name,"kk");
    Darr[0].age=20;
    Darr[0].score=120.8;
    Darr[1].age=20;


结构体数组的大小:

  1. 结构体大小*元素的个数
  2. sizeof(结构体数组名称)

结构体大小:

字节对齐原则 ---- 对齐8字节 比8字节小按照8字节开辟空间

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
    short a;// 2     开辟8字节
    int b; //4     
    double c;//8    开辟8字节
};

int main()
{
    struct demo Darr[3];
    printf("%d\n", sizeof(struct demo)); // 16
    return 0;
}

循环的赋值

输入输出:

   struct demo Darr[3];
    for (int i = 0; i < 3; i++)
    {
        scanf("%hd%d%lf", &Darr[i].a, &Darr[i].b, &Darr[i].c);
    }
    for (int i = 0; i < 3; i++)
    {
        printf("%d  %d  %lf \n", Darr[i].a, Darr[i].b, Darr[i].c);
    }

节省空间原则

减少空间浪费 ,尽可能的压缩

结构体指针

概念:指向结构体变量的指针

定义格式:

struct 结构体名 * 指针名;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct demo
{
    short a;  // 2     开辟8字节
    int b;    // 4
    double c; // 8    开辟8字节
} d1, d2;
struct work
{
    int a;
} w1;

int main()
{
    struct demo *p = &d1;
    struct demo *p1 = &w1;//错
    return 0;
}


​​​​​​​赋值:

1.指针变量名->成员变量名=新值

    struct demo *p = &d1;
    p->a=10;
    p->b=20;
    p->c=1.99;
    printf("%hd\n",p->a);


2.(*p).成员变量

    struct demo *p = &d1;
    (*p).a = 1000;
    printf("%hd\n", p->a);

大小:8字节

重定义指针

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct demo
{
    short a;  // 2     开辟8字节
    int b;    // 4
    double c; // 8    开辟8字节
} D, *DP;


int main()
{
    D d1;//struct demo d1
    DP p = &d1;//struct demo *
    (*p).a = 1000;
    printf("%hd\n", p->a);
    return 0;
}


总结:

1. 不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用

即:stu.id可以输出 直接输出stu不行 stu整体不行必须具体到每一个成员变量

2.如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 struct demo
{
    short a;  // 2     开辟8字节
    int b;    // 4
    double c; // 8    开辟8字节
} ;
struct work
{
char ch;
 struct demo d1;
}w1;
int main()
{
w1.d1.a=1;
w1.d1.b=20;
    return 0;
}

3. 可以把成员变量当成普通变量运算(++ --都可以)

4. 在数组中,数组之间是不能彼此赋值的,结构体变量可以相互赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值