一文学会c语言结构体的定义和使用方法

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

一文学会c语言结构体的定义和使用方法

撼沧   2022-11-24 我要评论

一、什么是结构体

在实际问题中,一组数据往往具有不同的数据类型;例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型。因为数据类型不同,显然不能用一个数组来存放。
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate datatype)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

定义结构体的一般形式为:

struct 结构体名{  
    成员列表  
}; 

在成员表列中可以是几种基本数据类型,也可以是结构体类型。

struct 类型名{} 变量;后的分号不能漏

例如用结构体来表示学生信息:

struct stu{  
    char *name;  //姓名  
    int num;  //学号  
    char sex;  //性别  
    float score;  //成绩  
};

二、结构体变量

结构体也是一种数据类型,可以用来说明变量。例如:

struct stu stu1, stu2; 

定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 4 个成员组成。注意关键字struct不能少。

结构体的各个成员在内存中是连续存储的。stu1、stu2 的内存如下图所示:

图片标题

也可以在定义结构体的同时定义结构体变量:

struct stu{  
    char *name;  //姓名  
    int num;  //学号  
    char sex;  //性别  
    float score;  //成绩  
} stu1, stu2;  

如果只需要 stu1、stu2 两个变量,也可以不写结构体名字:

struct{  //没有写 stu  
    char *name;  //姓名  
    int num;  //学号  
    char sex;  //性别  
    float score;  //成绩  
} stu1, stu2;  

这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。

也可以用宏定义使一个符号常量来表示一个结构类型,例如:

#define STU struct stu  
STU{  
    char *name;  //姓名  
    int num;  //学号  
    char sex;  //性别  
    float score;  //成绩  
};  
STU stu1, stu2;

后面我们会学习Windows编程,大部分结构体都是这样定义的。

typedef和#define用法不同,甚至可以结合起来灵活使用,使用时一定要注意两者的不同之处。

三、成员的获取和赋值

在C语言中,使用点号.来获取结构体中的一个成员,一般格式为:

结构变量名.成员名  

例如:

stu1.name;  //第一个学生的姓名  
stu2.score;  //第二个学生的成绩  

获取成员后,就可以对该成员进行赋值了,例如:

stu1.name = “Tom”;
stu2.score = 90.5;

除了可以对成员进行逐一赋值,也可以像数组一样整体赋值,例如:

struct stu{  
    char *name;  //姓名  
    int num;  //学号  
    char sex;  //性别  
    float score;  //成绩  
} stu1, stu2 = { "Tom", 10, 'M', 90 };  

不过整体赋值仅限于上面这样的情况,也就是定义结构体的同时声明变量。下面的写法是错误的:

stu2 = { "Tom", 10, 'M', 90 };  

一个完整的示例:

#include <stdio.h>  
#define STU struct stu  
int main(){  
    STU{  
        char *name;  //姓名  
        int num;  //学号  
        char sex;  //性别  
        float score;  //成绩  
    };  
    STU stu1;  
    stu1.name = "James Bond";  
    stu1.num = 1;  
    stu1.sex = 'M';  //用M表示男性,W表示女性  
    stu1.score = 99;  
    printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num);  
    return 0;  
}  

附:结构体数组

指向结构体对象的指针变量既可以指向结构体变量,也可以指向结构体数组中的元素。

struct Student
{
    int num;
    char name[20];
    char sex;
} s1[3];
struct Student *p;

指针可以指向数组,代码如下:p = s1; p = &s1[0]; 指针移动p++ 移动一个结构体字节大小;

指针访问成员方式:(*p).num   p->num。

总结

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们