【结构体】

为什么需要结构体
为了表示一些复杂的事物,而普通的数据类型无法满足实际需求
什么叫结构体
把一些基本的类型组合在一起行程的一个新的符合数据类型,叫做结构体4
如何定义结构体
3种方式

struct Student//第一种
{
    int age;
    float socre;
    char sex;
};
struct Student//第2种
{
    int age;
    float socre;
    char sex;
} st2;

struct Student//第3种
{
    truct Student st = { 88,66.6,'F' };
}st3;

怎么使用结构体变量

  • 赋值和初始化
  • 如何去除结构体变量中的每一个成员
  • 结构体变量的运算
  • 结构体变量和结构体变量指针作为函数参数传递的问题
  • 举例
    动态构造存学生信息的结构体数组

  • 链表


  • 赋值和初始化
    定义的同时可以整体初值
    如果定以之后,则只能单个的赋初值
struct Student
{
    int age;
    float socre;
    char sex;
};

int main()
{
        struct Student st = { 88,66.6,'F' };//初始化,定义的同时赋值
        struct Student st2;
        st2.age = 10;
        st2.sex = 'F';
        st2.socre = 88;

        printf("%d %f %c\n",st.age,st.socre,st.sex );
        printf("%d %f %c\n", st2.age,st2.socre,st2.sex);
}
  • 如何去除结构体变量中的每一个成员
    1.结构体变量名.成员名
    2.指针变量名->成员名
    在计算机内部会被转化为(*指针变量名).成员名
struct Student
{
    int age;
    float socre;
    char sex;
};

int main()
{
    struct Student st = { 88,66.6,'F' };//初始化,定义的同时赋值

    struct Student *pst = &st;//只能存放struct Student的地址
    st.age;//第一种
    pst->age = 88;//第二种

}
  1. pst->age 在计算机内部会被转化成(*pst).age….这个硬性规定,也是->的含义;
  2. 所以pst->age等价于(*pst).age也等价于st.age
  • 结构体变量和结构体变量指针作为函数参数传递的问题
void InputStudent(struct Student *);//pstu只占4个字节
void OutputStudent(struct Student );
struct Student
{
    int age;
    char sex;
    char name[100];
};

int main()
{
    struct Student st;
    InputStudent(&st);//对结构体变量输出,必须发送st的地址
    OutputStudent(st);//对结构体变量输出,可以发送st的地址,也可以发送
}

void InputStudent(struct Student *pstu)//pstu只占4个字节
{
    (*pstu).age = 10;
    strcpy(pstu->name, "张三");
    pstu->sex = 'F';
}

void OutputStudent(struct Student ss)
{
    printf("%d %c %s \n", ss.age, ss.sex, ss.name);
}
  • 应该发送地址还是发送内容
void InputStudent(struct Student *);//pstu只占4个字节
void OutputStudent(struct Student *);
struct Student
{
    int age;
    char sex;
    char name[100];
};

int main()
{
    struct Student st;
    InputStudent(&st);//对结构体变量输出,必须发送st的地址
    OutputStudent(&st);//对结构体变量输出,可以发送st的地址,也可以发送st的内容,但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
}

void InputStudent(struct Student *pstu)//pstu只占4个字节
{
    (*pstu).age = 10;
    strcpy(pstu->name, "张三");
    pstu->sex = 'F';
}

void OutputStudent(struct Student *pst)
{
    printf("%d %c %s \n", pst->age, pst->sex, pst->name);
}

指针的优点:
快速地传递数据
耗用内存小
执行速度快

  • 结构体变量的运算

结构体变量不能相加,不能相减,也不能想除,但结构体变量可以相互赋值

  • 举例
    • 动态构造存学生信息的结构体数
      • 动态构造一个数组,存放学生的信息,然后按分数排序
struct Student {
    int age;
    float score;
    char name[100];
};

int main()
{
    int len,i,j;
    struct Student *pArr;
    struct Student t;
    printf("请输入学生的个数:\n");
    printf("len = ");
    scanf("%d",&len);

    //%动态构造一维数组
    pArr=(struct Student *)malloc(len*sizeof(struct Student));

    for (i = 0; i < len; ++i)
    {
        printf("请输入%d个学生的信息:", i + 1);

        printf("age = ");
        scanf("%d", &pArr[i].age);

        printf("name = ");
        scanf("%s", pArr[i].name);//因为name是数组名,本身就是首元素的地址,所以pArr[i].name不能够改成&pArr[i].name

        printf("score = ");
        scanf("%f", &pArr[i].score);
    }
    //输出
    for (i = 0; i < len; ++i)
    {
        printf("第%d个学生的信息:\n", i + 1);
        printf("age =%d \n", pArr[i].age);
        printf("name =%s\n", pArr[i].name);
        printf("score =%f\n",pArr[i].score);

        printf("\n");
    }
    //排序
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - j; j++)
        {
            if (pArr[j].score > pArr[j + 1].score)
            {
                t = pArr[j];
                pArr[j] = pArr[j + 1];
                pArr[j + 1] = t;
            }
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值