博客
关于我
C语言:结构体——《手把手将你学C语言》
阅读量:248 次
发布时间:2019-03-01

本文共 2807 字,大约阅读时间需要 9 分钟。

C语言结构体

结构体是C语言中的基本数据类型,用于将多个不同的数据项合并为一个单一的数据对象。它类似于面向对象编程中的类和对象,但又有着更底层的特性。结构体广泛应用于处理那些需要同时存储多种类型数据的场景,例如学生信息、产品信息等。

结构体的定义和使用

结构体的声明

结构体的声明是通过struct关键字进行的,格式如下:

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

这里的结构体名是结构体的名称,通常使用大写字母表示。而成员列表则包含了结构体中各成员的数据类型和名称。例如:

struct STUDENT{    int age;    // 年龄,整型数    int grade;  // 年级,整型数    char name[20];  // 姓名,字符数组,长度为20    char addr[30];  // 地址,字符数组,长度为30};

需要注意的是,struct关键字仅仅是表示这是一个结构体定义,真正的数据类型名称是结构体名。例如,STUDENT是与int等价的结构体类型,但它本身并不等价于int类型。

结构体类型变量

仅仅声明结构体类型是无法使用的,必须定义一个结构体变量。例如:

struct STUDENT{    int age;    // 年龄,整型数    int grade;  // 年级,整型数    char name[20];  // 姓名,字符数组,长度为20    char addr[30];  // 地址,字符数组,长度为30} stud;  // 定义了一个名为`stud`的结构体变量

stud是一个具有内存空间的结构体变量,可以通过以下三种方式对其成员进行引用:

结构体对数据的引用

结构体变量可以像普通变量一样被引用。例如:

#include 
#include
struct STUDENT{ int age; // 年龄,整型数 int grade; // 年级,整型数 char name[20]; // 姓名,字符数组,长度为20 char addr[30]; // 地址,字符数组,长度为30};int main(void) { struct STUDENT s1 = { // 初始化一个结构体变量 12, // 年龄 100, // 年级 "小明", // 姓名 "北京" // 地址 }; strcat(s1.name, "小刚"); // 将姓名添加上"小刚" s1.age = 18; // 修改年龄 printf("%d\n", s1.age); // 输出年龄 printf("%s", s1.name); // 输出姓名 return 0;}

结构体的初始化

结构体变量在定义时最好进行全面初始化。未初始化的成员可能会保留未知值,导致后续操作出现错误。可以通过以下方式初始化结构体变量:

struct STUDENT s1 = {    .age = 18,  // 初始化年龄为18    .grade = 100,  // 初始化年级为100    .name = "小明",  // 初始化姓名为"小明"    .addr = "北京"   // 初始化地址为"北京"};

结构体的字节对齐

在C语言中,结构体成员的存储是按照字节对齐的方式进行的。字节对齐的目的是确保每个成员的存储起始位置在字节的整数倍处。例如:

struct STUDENT{    char a1;  // 1字节    char a2;  // 1字节    int b;    // 4字节};

在上述结构体中,a1a2会共享同一字节,因为它们都是字符类型。b则需要占用4个字节。因此,整个结构体的大小为7字节(4字节用于b,2字节用于a1a2)。

需要注意的是,成员的顺序决定了它们在内存中的存储顺序。例如:

struct STUDENT{    char a1;  // 1字节    int b;    // 4字节    char a2;  // 1字节};

此时,a1a2会共享同一字节,但它们的存储顺序是a1b之前,a2b之后。整个结构体的大小为7字节。

结构体数组

结构体数组的定义方式与普通数组类似。例如:

struct STUDENT stu[10];  // 定义了一个包含10个结构体的数组

与普通数组不同的是,结构体数组中的每个元素都是一个结构体变量。结构体数组的初始化和使用方式与普通数组完全一致。

结构体指针

结构体指针允许我们以指针的形式引用结构体变量。例如:

#include 
#include
struct STUDENT{ int age; // 年龄,整型数 int grade; // 年级,整型数 char name[20]; // 姓名,字符数组,长度为20 char addr[30]; // 地址,字符数组,长度为30};int main(void) { struct STUDENT s1 = { // 初始化一个结构体变量 12, // 年龄 100, // 年级 "小明", // 姓名 "北京" // 地址 }; struct STUDENT *p = &s1; // 将结构体变量s1赋值给指针p strcat(p->name, "小刚"); // 将姓名添加上"小刚" p->age = 18; // 修改年龄 printf("%d\n", p->age); // 输出年龄 printf("%s", p->name); // 输出姓名 return 0;}

结构体指针的使用方式与普通指针类似,但需要注意以下几点:

  • 结构体指针需要使用->运算符进行引用,->运算符的优先级高于.运算符。
  • 结构体指针的使用需要谨慎,因为它直接指向结构体的内存地址,错误使用可能导致程序崩溃或数据丢失。
  • 通过以上内容可以看出,结构体在C语言中的应用非常广泛。无论是单个结构体变量的使用,还是结构体数组、结构体指针的应用,都为程序的开发提供了强大的数据处理能力。

    转载地址:http://lvux.baihongyu.com/

    你可能感兴趣的文章
    Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
    查看>>
    Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
    查看>>
    Netty:原理架构解析
    查看>>
    Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
    查看>>
    Network Sniffer and Connection Analyzer
    查看>>
    Network 灰鸽宝典【目录】
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    network小学习
    查看>>
    Netwox网络工具使用详解
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    Net操作配置文件(Web.config|App.config)通用类
    查看>>
    Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
    查看>>
    New Relic——手机应用app开发达人的福利立即就到啦!
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS
    查看>>
    NFS Server及Client配置与挂载详解
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>