黑马程序员——C语言基础---结构体

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、概念

结构体是一种构造类型,它是由若干个成员组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若传递参数较多,传一个结构体相对简单。

二、结构体定义

1.结构体一般定义形式

struct 结构体名{
    类型名1 成员名1;
    类型名2 成员名2;
    类型名3 成员名3;
    ...
};

定义一个学生

struct Student {
    char *name;
    int age;
    float height;

};

注意点:结构体定义时注意大括号后面有分号。

三、结构体变量的定义

1.先定义结构体类型,再定义变量。

struct Student {
    char *name;
    int age;
};
struct Student stu;

结构体变量名为stu

2.定义结构体类型的同时定义变量

struct Student {
    char *name;
    int age;
}stu;

结构体变量名为stu

3.省略类型名,定义结构体类型变量

struct {
    char *name;
    int age;
}stu;

结构体变量名为stu

四、结构体变量赋值
1.第一种赋值方式

    struct Student stu;
    //结构体变量名.成员  
    stu.name = "kingwang";
    stu.age = 23;
    printf("name=%s\n,age=%d\n",stu.name,stu.age);

2.第二种赋值方式

struct Student stu = {"kingwang",23 };
printf("name=%s\n,age=%d\n",stu.name,stu.age);

3.第三种赋值方式

struct Student stu = {.name = "kingwang", .age = 23};
printf("name=%s\n,age=%d\n",stu.name,stu.age);

注意:struct Student stu;
stu = {"kingwang",23};

这种赋值方式是错误的,定义结构体的时候应该同时一次性初始化,或者这样赋值stu.name = "kingwang";stu.age = 23;

补充:结构体变量也可以作为另一个结构体的成员,如果某个成员也是结构体变量,可以连续使用成员运算符”.”访问最低一级成员

struct Date{
    int year;
    int month;
    int day;
};

struct Student {
    char *name;
    struct Date birthday;
};

struct Student stu;
stu.birthday.year = 1993;
stu.birthday.month = 11;
stu.birthday.day = 2;

结构体数组用法和普通数组用法一样

struct Student {
    char *name;
    int age;
}stu[2] = {{"kingwang",23},{"wang",22}};

五、结构体内存问题
定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样的道理。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。

struct {
    char *name;
    int age;
};
struct Student stu;

前面四行是没有分配存储空间的,当执行第5行时才分配存储空间给stu变量。
结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。

六、结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中的成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。

示例代码

#include<stdio.h>
//定义一个结构体
struct Student {
    int age;
};

void test(struct Student stu){
    printf("修改前的形参:%d\n",stu.age);
    //修改实参中的age
    stu.age = 10;

    printf("修改后的形参:%d\n",stu.age);
}

int main(int argc, const char * argv[]){
    // insert code here...

    struct Student stu = {30};
    printf("修改前的实参:%d\n",stu.age);

    //调用test函数
    test(stu);
    printf("修改后的实参:%d\n",stu.age);
    return 0;
}

输出结果:
这里写图片描述

七、指向结构体的指针
每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
结构体指针变量的定义形式:struct 结构体名 *指针变量名
有了指向结构体的指针,那么就有3种访问结构体成员的方式
1.结构体变量名.成员名
2.(*指针变量名).成员名
3.指针变量名->成员名
示例代码

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...

    //定义一个结构体类型
    struct Student {
        char *name;
        int age;
    };

    //定义一个结构体变量
    struct Student stu = {"kingwang",23};

    //定义一个指向结构体的指针变量
    struct Student *p;

    //指向结构体变量stu
    p = &stu;

    //方式1.结构体变量名.成员名
    printf("name=%s,age=%d\n",stu.name,stu.age);

    //方式2.(*指针变量名).成员名
    printf("name=%s,age=%d\n",(*p).name,(*p).age);

    //方式3.指针变量名->成员名
    printf("name=%s,age=%d\n",p->name,p->age);

    return 0;
}

这里写图片描述

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值