博客
关于我
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/

    你可能感兴趣的文章
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    numpy.linalg.norm(求范数)
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
    查看>>
    Numpy:按多个条件过滤行?
    查看>>
    Numpy:条件总和
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy中的argsort的用法
    查看>>
    NumPy中的精度:比较数字时的问题
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy学习笔记3-array切片
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy最大值和最大值索引
    查看>>
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>