首页 > 其他分享 >C语言结构体简介:“结”在一起,“构”成一“体”

C语言结构体简介:“结”在一起,“构”成一“体”

时间:2024-12-29 20:26:14浏览次数:7  
标签:hero struct 简介 age C语言 Person 成一 结构 定义

一、什么是结构体

如果要一下子记录很多条数据,咱们一般都会想到用数组,比如记录一个班的学生的成绩。

但是数组有个限制:元素必须是同一数据类型。

如果我们想同时记录一个人的姓名(字符串)、年龄(整型)、身高(浮点型)等信息时,数组就派不上用场了,这时候就要用到结构体。

结构体(struct)内的元素可以有不同的数据类型,它把各路英雄好汉集结到一块儿,组成一队,抱团取暖。这也正是其名字的含义:“结”在一起,“构”成一“体”。

二、结构体的定义

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

struct 结构体名{
    类型名1 成员名1;
    类型名2 成员名2;
    ……
    类型名n 成员名n;   
 };

我们一般把结构体中的元素称为“成员”,这些成员的定义就和定义普通变量的方法一样。结构体就是拉了一伙“成员”,组成个大家庭,这个大家庭的名字由大括号前的结构体名定义。

比如我们定义一个人:

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
};

Person就是结构体的名字,Person这个“大家庭”里面有三个成员:name、age、height。

试想一下,如果不用结构体,我们得分别定义多个变量,使用起来既不方便也不直观。有了结构体,组成了大家庭,以后就可以以家庭为单位一次性存储所有信息,是不是很方便?

三、结构体变量的定义

定义结构体只是定义了一种数据类型,就和int一样,并不是变量。比如前面定义的Person只是定义了名字为Person的结构体类型。虽然写了一大堆,但系统并不会为其分配存储空间,因为还没定义变量。只有当定义了结构体变量时,系统才会分配存储空间给该变量。

要定义结构体变量,有以下几种方式:

1.分开定义:先定义结构体类型,再定义变量

比如在定义了前面的Person后,加上一行:

struct Person hero;

它定义了一个结构体变量,变量名为hero。

我们还可以在定义hero时一并进行初始化:

struct Person hero = {"Iron Man", 47, 180.5};

注意,这种用大括号{}的初始化方式只能在定义变量的同时进行,就和数组的初始化是一样的。你不能再定义变量后再用这种方式赋值,比如下面的代码就是错误的:

struct Person hero;
hero = {"Iron Man", 47, 180.5};

2.合并定义:定义结构体类型的同时定义变量

将定义结构体类型和变量合在一处:

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
} hero;

因为已经定义了结构体变量,hero与它上面的结构体自然地捆绑在一起,所以这种情况还可以把结构体类型的名字Person省略掉。

四、结构体赋值

1.结构体元素的赋值

结体体内元素的访问形式为:结构体变量名.成员名

如定义了前面的结构体变量hero后,就可以通过hero.name、hero.age、hero.height的方式访问并赋值了。

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
};
struct Person hero;
hero.age = 9527;

注:"."称为成员运算符,它在所有运算符中优先级最高。

2.结构体变量的赋值

可以像普通变量那样,对相同类型的结构体变量进行赋值:

struct Person student;
student = hero; //同一结构体变量赋值

五、结构体的注意事项

1.不允许对结构体本身递归定义

结构体中的元素类型不能是结构体本身的类型。如下面的定义是错误的:

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
    struct Person hero; //错误
};

为什么不行呢?它会像递归一样,不断地向下一层扩展结构体,却没有终止条件,因此相当于无限递归(和死循环是一个道理)。

2.结构体内可以包含其它结构体

元素含有结体本身会无限扩展,但含有其他结构体就不存在这个问题了,因此是可以的。

比如:

struct Date {
    int year;
    int month;
    int day;
};

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
    struct Date birthday;
};

六、结构体数组

1.定义

像定义普通类型的数组一样,也可以定义结构体数组:

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
};
struct Person hero[5];

当然也可以采用前面讲的合并定义形式:

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
} hero[5];

2.初始化

struct Person {
    char name[50]; //名字
    int age; //年龄
    float height; //身高
} hero[2]={ {"Iron Man", 47, 180.5}, {"Batman", 39, 140.5}};

七、结构体作为函数参数

结构体变量和普通变量一样,可以作为函数参数。它传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。比如:

void printPersonInfo(struct Person p) {
    printf("Name: %s\n", p.name);
    printf("Age: %d\n", p.age);
    printf("Height: %.1f cm\n", p.height);
}

我们可以直接用下面一行代码打印hero的信息:

printPersonInfo(hero);

八、指向结构体的指针

和普通的指针定义方式基本一样,结构体指针变量的定义形式:struct 结构体名称 *指针变量名

有了指向结构体的指针,那么就有了3种访问结构体成员的方式:

①结构体变量名.成员名

② (*指针变量名).成员名

③指针变量名->成员名

示例代码:

#include<stdio.h>

int main(){
    struct Person {
        char name[50]; //名字
        int age; //年龄
        float height; //身高
    };

    struct Person hero = {"Iron Man", 47, 180.5};

    struct Person *p; // 定义一个指向结构体的指针变量

    p = &hero; // 指向结构体变量hero

    //三种方式打印
    printf("%s, %d, %.1f\n", hero.name, hero.age, hero.height);
    printf("%s, %d, %.1f\n", (*p).name, (*p).age, (*p).height);
    printf("%s, %d, %.1f\n", p->name, p->age, p->height);

    return 0;
}

运行结果:

标签:hero,struct,简介,age,C语言,Person,成一,结构,定义
From: https://blog.csdn.net/jjmhx/article/details/144809735

相关文章

  • 【C语言】多进程/多线程
    多进程/多线程多进程服务器步骤代码多线程一、线程创建和回收二、线程属性三、线程分离多进程服务器步骤  服务器使用父进程fork创建子进程来和客户端进行通信,父进程负责取出连接请求。并且父进程接收子进程退出信号,通过信号处理函数回收子进程步骤:1.首先屏......
  • 【C语言】线程同步
    【C语言】线程同步线程同步1.互斥锁2.读写锁3.条件变量4.信号量线程同步  线程同步是指在多线程的情况下,如果多个线程去访问共享资源,需要按照一定规则顺序依次去访问,保证共享资源的数据一致性。1.互斥锁互斥相关函数//互斥量pthread_mutex_tmutex;//p......
  • C语言二维数组
    在C语言中,二维数组是一种常用的数据结构,用于存储和处理具有行和列结构的数据。以下是关于C语言二维数组的详细介绍: 1.二维数组的定义 二维数组本质上是数组的数组。其定义语法如下: c数据类型数组名[行数][列数];  例如,定义一个3行4列的整数二维数组: cint......
  • C语言函数的参数
    在C语言中,函数参数是用于向函数传递数据的重要元素。 函数参数分为形式参数(形参)和实际参数(实参)。 形式参数 -定义在函数声明或定义中的参数。例如在函数 intadd(inta,intb) 中, a 和 b 就是形参。它们像是函数内部的变量,在函数被调用时才会被分配内存空间,用......
  • C语言学习笔记(基础语法篇)
    C语言学习笔记(基础语法篇)序言首先事先说明一下,这是我从各处整理的,当初刚接触CS,甚至连标注意识都没有,再次感谢写这些文章的人.当然这里不是说全部都是别人写的了,也有一点我自己的思考.首先是几个注意点:结构化,模块化,分而治之多写注释,多调试指针也有不同类型......
  • 银行业务队列简单模拟(C语言)
    题目:设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍——即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗......
  • PTA 约瑟夫环(C语言)
    题目:N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。请按退出顺序输出每个退出人的原序号。输入格式:输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。输出格式:按退出顺序......
  • 使用canvas生成一张名片
    在前端开发中,使用HTML5的<canvas>元素可以动态地生成图像。以下是一个简单的示例,展示如何使用<canvas>来生成一张名片:HTML结构:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="......
  • 将一个浮点数或任何其他类型的值赋给 unsigned char 类型的变量时,C语言进行类型转换
    C语言中,unsignefcharTemp_Val;Temp_Val=(unsignefchar)rd_temperature();若rd_temperature()函数返回51.7,则Temp_Val等于多少?在C语言中,unsignedchar 类型通常用于存储0到255之间的无符号整数。当你将一个浮点数或任何其他类型的值赋给 unsignedchar 类型的变量时,C语言......
  • C语言.基础.运算符(二)
    目录运算符类型运算符的优先级运算符的结合性算术运算符赋值运算符关系运算符逻辑运算符 位运算符C语言内置的位运算符: 位运算符的几种特殊操作:1左移实现乘法2右移实现除法3 不使用中间变量交换两个整型变量的值4判断整数的奇偶性5位操作进行高低位交......