C语言中的结构体的入门学习教程

下面就是针对“C语言中的结构体的入门学习教程”的完整攻略:

什么是结构体

在C语言中,结构体是一种自定义的数据类型,可以将多个不同类型的数据组合成一个整体,以实现更方便的数据处理。

结构体定义的格式如下:

struct 结构体名{
    数据类型1 成员名1;
    数据类型2 成员名2;
    ......
    数据类型n 成员名n;
};

其中,结构体名是自定义的类型名称,成员名可以是任意合法的标识符。以下是一个实际的结构体定义示例:

struct student{
    int id;
    char name[20];
    int age;
};

这个结构体定义了一个学生类型,包含学生的学号、姓名和年龄三个成员。

使用结构体时,可以通过“.”操作符来访问结构体中的成员,例如:

struct student s = {10086, "张三", 18};
printf("学生的学号是:%d\n", s.id);
printf("学生的姓名是:%s\n", s.name);
printf("学生的年龄是:%d\n", s.age);

结构体的初始化

结构体变量可以像普通变量一样初始化,可以使用以下方式进行初始化:

struct student s1 = {10086, "张三", 18};        // 全部初始化
struct student s2 = {10010};                    // 部分初始化
struct student s3 = {.name = "李四", .age = 20}; // 指定成员初始化

其中,第一种方式是对全部成员进行初始化,第二种方式是对部分成员进行初始化,未初始化成员会被自动赋值为0或空字符。第三种方式是对指定的成员进行初始化,未指定的成员会被自动赋值为0或空字符。

结构体的指针

结构体变量也可以有指针类型,使用指针可以更灵活地操作结构体中的成员。结构体指针的定义方式与普通指针一样,例如:

struct student *p;

访问结构体成员时,需要使用“->”操作符,例如:

p = &s;
printf("学生的学号是:%d\n", p->id);
printf("学生的姓名是:%s\n", p->name);
printf("学生的年龄是:%d\n", p->age);

结构体作为函数参数

结构体作为函数的参数时,可以传递结构体变量或结构体指针,例如:

void print_student(struct student s){
    printf("学生的学号是:%d\n", s.id);
    printf("学生的姓名是:%s\n", s.name);
    printf("学生的年龄是:%d\n", s.age);
}

void change_student(struct student *p){
    p->id = 10010;
    strcpy(p->name, "王五");
    p->age = 19;
}

struct student s = {10086, "张三", 18};
print_student(s);
change_student(&s);
print_student(s);

示例一

以下是一个定义和初始化结构体的示例:

#include <stdio.h>

struct student{
    int id;
    char name[20];
    int age;
};

int main(){
    struct student s1 = {10086, "张三", 18};
    struct student s2 = {10010};
    struct student s3 = {.name = "李四", .age = 20};

    printf("学生1的学号是:%d,姓名是:%s,年龄是:%d\n", s1.id, s1.name, s1.age);
    printf("学生2的学号是:%d,姓名是:%s,年龄是:%d\n", s2.id, s2.name, s2.age);
    printf("学生3的学号是:%d,姓名是:%s,年龄是:%d\n", s3.id, s3.name, s3.age);

    return 0;
}

输出结果如下:

学生1的学号是:10086,姓名是:张三,年龄是:18
学生2的学号是:10010,姓名是:,年龄是:0
学生3的学号是:0,姓名是:李四,年龄是:20

示例二

以下是一个使用结构体指针修改结构体成员的示例:

#include <stdio.h>
#include <string.h>

struct student{
    int id;
    char name[20];
    int age;
};

void change_student(struct student *p){
    p->id = 10010;
    strcpy(p->name, "王五");
    p->age = 19;
}

int main(){
    struct student s = {10086, "张三", 18};
    printf("修改前,学生的学号是:%d,姓名是:%s,年龄是:%d\n", s.id, s.name, s.age);

    change_student(&s);
    printf("修改后,学生的学号是:%d,姓名是:%s,年龄是:%d\n", s.id, s.name, s.age);

    return 0;
}

输出结果如下:

修改前,学生的学号是:10086,姓名是:张三,年龄是:18
修改后,学生的学号是:10010,姓名是:王五,年龄是:19

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中的结构体的入门学习教程 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • ECMAScript6变量的解构赋值实例详解

    ECMAScript6变量的解构赋值实例详解 什么是解构赋值 解构赋值是ES6中的一个新特性,它允许你从数组或者对象中提取出数据并赋值到新的变量中。 数组解构赋值 let [a, b, c] = [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3 数组解构赋值中,…

    C 2023年5月23日
    00
  • python读写json文件的简单实现

    当我们需要对数据进行存储和传递的时候,一种非常常用的格式就是JSON。而在Python中,对于JSON的读写也变得非常的简单,下面就来详细的介绍一下读写JSON的攻略。 1. 读取JSON文件 在Python中,我们使用json模块来读写JSON文件。 首先要做的就是打开文件,接着使用json.load()来读取: import json with open…

    C 2023年5月23日
    00
  • 实例解析iOS应用多线程开发中NSthread类的用法

    实例解析iOS应用多线程开发中NSthread类的用法 简介 在 iOS 应用的多线程开发中,NSthread 是一种常用的线程处理方式。本攻略旨在讲解 iOS 应用中如何使用 NSthread 类,以实现线程处理。在本攻略中,我们将包含以下内容: NSthread 基本用法 线程间通信的实现方法 两个 NSthread 实例示例说明 NSthread 基本…

    C 2023年5月22日
    00
  • C语言详细讲解注释符号的使用

    C语言详细讲解注释符号的使用 在C语言中,注释符号常用于给代码添加说明和解释,方便其他人理解你的代码。在本文中,我们将详细讲解C语言中注释符号的使用。 单行注释 在C语言中,单行注释的符号为//。使用单行注释,可以对单行代码进行注释说明,而不影响其他行的代码。 下面是一个示例: int main() { // 输出Hello, world! printf(&…

    C 2023年5月24日
    00
  • C语言实现阶乘的示例详解

    C语言实现阶乘的示例详解 什么是阶乘 阶乘是一个数学术语,表示从1到该数所有自然数的乘积。通常用符号“!”表示。例如,3的阶乘为3! = 1 x 2 x 3 = 6。 示例1:使用for循环计算阶乘 下面是一个使用for循环计算阶乘的示例: #include <stdio.h> int main() { int num; int fac = 1;…

    C 2023年5月23日
    00
  • 浅析C语言中的setjmp与longjmp函数

    浅析C语言中的setjmp与longjmp函数 什么是setjmp与longjmp函数 setjmp与longjmp是C语言中用于实现非局部跳转的函数。 setjmp函数的原型为: #include <setjmp.h> int setjmp(jmp_buf env); 执行setjmp函数时,将当前程序状态保存到jmp_buf类型的变量env中…

    C 2023年5月24日
    00
  • C语言实现用户态线程库案例

    C语言实现用户态线程库案例攻略 1. 理解用户态线程库 用户态线程库是一种多线程机制,其特点是由用户程序掌控所有线程的调度和管理,而不是交给操作系统内核的调度。因此,在用户态线程库中,线程的切换和调度通过用户程序实现,减少了系统调用的开销,提高了CPU的利用率和程序响应速度。 用户态线程库分为两类:协作式和抢占式。协作式线程库需要线程主动释放CPU资源,而抢…

    C 2023年5月23日
    00
  • c++显式类型转换示例详解

    C++ 显式类型转换示例详解 什么是显式类型转换 在C++中,有时候我们需要将一种数据类型(例如字符串)转换为另一种数据类型(例如数字)。这就需要使用类型转换操作符。 C++中的类型转换分为两种,一种是隐式类型转换,另一种是显式类型转换。其中隐式类型转换由编译器自动完成,而显式类型转换需要程序员手动调用类型转换操作符进行转换。 显式类型转换的语法 C++支持…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部