分享好友 编程语言首页 频道列表

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

C/C++教程  2023-02-09 05:140

一、什么是结构体

在实际问题中,一组数据往往具有不同的数据类型;例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型。因为数据类型不同,显然不能用一个数组来存放。
在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 的内存如下图所示:

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

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

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。

总结

原文地址:https://blog.csdn.net/qq_32832803/article/details/110926157

查看更多关于【C/C++教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Rust应用调用C语言动态库的操作方法
目录外部功能接口FFIUDP套接字的读超时Rust调用C语言动态库中的函数避免重复造***,使用Rust官方C语言库外部功能接口FFI虽然高级(脚本)编程语言的功能丰富,表达能力强,但对底层的一些特殊操作的支持并不完善,就需要以其他编程语言来实现。调用其他编程语

0评论2023-02-09585

Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)
uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间,c语言中time()是按格林威治时间计算的,北京时间比格林威治时间多了8小时DateTimeToUnix(Now)-8*60*

0评论2023-02-09876

Unicode与UTF-8互转(c语言和lua语言) python utf-8转unicode
1. 基础1.1 ASCII码我们知道, 在计算机内部, 全部的信息终于都表示为一个二进制的字符串. 每个二进制位(bit)有0和1两种状态, 因此八个二进制位就能够组合出 256种状态, 这被称为一个字节(byte). 也就是说, 一个字节一共能够用来表示256种不同的状态, 每个状态

0评论2023-02-09468

R语言之merge详解 c语言merge函数代码
merge是R语言中用来合并数据框的函数merge函数的声明:?1234merge(x, y, by = intersect(names(x), names(y)),      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,      sort = TRUE, suffixes = c(".x"

0评论2023-02-09489

R语言调用的C语言源代码查询 R语言 c
R语言使用时可以调用自己写的C代码,但是有些C函数是软件包自带的,怎么查询在使用软件包 kerfdr 时,涉及到一个函数y = .C("massdist", x = as.double(xtrunc), xmass = as.double(tau[trunc]/sum(tau[trunc])), nx = nx, xlo = as.double(lo), xhi = as.dou

0评论2023-02-09487

centos安装与配置R语言 centos配置c语言环境
Linux下安装R语言一、编译安装      由于采用编译安装,所以需要用到gcc编译环境,在编译前check文件时还会用到libXt-devel和readline-devel两个依赖,所以在编译R语言源码时先将这些工具和依赖包准备好。readline-devel 也可以不安装,不安装此包R语言编

0评论2023-02-09905

C语言利用链表实现学生成绩管理系统
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示

0评论2023-02-09722

C语言通过三种方法实现属于你的通讯录
目录一、基础版本1.1 通讯录的个人信息(结构体来实现)1.2通讯录名单1.3人员初始化1.4菜单1.5主函数二、功能的实现2.1、增加人数2.2、删除人数2.3、查找2.4、展示2.5、排序(这里我是通过名字)三、通讯录进阶(设置动态存储)3.1通讯录从静态改为动态3.2通

0评论2023-02-09881

C++集体数据交换实现示例讲解 c语言两个数据交换
目录一、说明二、示例和代码一、说明到目前为止介绍的功能共享一对一的关系:即一个进程发送和一个进程接收。链接是通过标签建立的。本节介绍在多个进程中调用相同参数但执行不同操作的函数。对于一个进程,函数可能会发送数据,对于另一个进程,它可能会接收

0评论2023-02-09687

C语言中#if的使用 c语言中%c
目录#if定义#if使用#if的后面接的是表达式#if defined的使用ifdef的使用结尾#if定义#if和#endif是一组同时使用的,叫做条件编译指令。#if与#define、#include等指令一样是由预处理器这个强大的工具处理的,预处理器可以在编译前处理c程序。#if使用#if的后面接

0评论2023-02-09343

更多推荐