问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言结构体类型详解:定义、创建、初始化和引用

创作时间:
作者:
@小白创作中心

C语言结构体类型详解:定义、创建、初始化和引用

引用
CSDN
1.
https://blog.csdn.net/tan_run/article/details/135456291

在实际编程过程中,我们可能会希望把一些关联的数据存放在一起,这样方便我们使用。但是这些数据的类型有时候并不一致,例如一个学生的信息:有名字(字符串),有年龄(整数),性别(字符)等等。这时候,我们就可以使用自定义类型——结构体类型,将这些类型不一样的关联数据放在一个结构体类型里面。

这篇文章主要讲解C语言中的结构体类型,包括以下几个方面:

  1. 结构体的定义
  2. 结构体变量的创建与初始化
  3. 结构体成员的引用

结构体类型

一、结构体类型的定义(声明)

1. 一般结构体定义

C语言中结构体类型的定义形式如下:

struct  结构体名
{
     成员项表列
};
//在定义结构体类型的时候,成员不需要初始化;当我们创建了变量时,才需要对变量成员初始化

例如,定义一个包含名字(字符串)、年龄(整数)和性别(字符)的结构体类型,名字叫stu

struct stu
{
    char name[20];
    int age;
    char sex;
}

2. 组合型结构体定义

如果要在stu结构体的基础上补充一个出生日期(出生日期还要包括:年,月,日),这个时候,我们就可以多定义一个能够记录出生日期的date结构体类型,然后再在定义学生结构体类型的时候,引用这个date结构体。具体定义形式如下:

struct date
{
    int year;
    int month;
    int day;
};
struct stu
{
    char name[20];
    int age;
    char sex;
    struct date birthday;
};

注意:在定义组合型的结构体类型时,一定要遵守先定义后使用的原则。例如:定义上面的stu结构体时,成员birthday是一个结构体变量,那我们就要保证birthday这个结构体变量的结构体类型在之前已经先定义过了(在这里也就是date已经先定义了)。

二、结构体变量的创建与初始化

1. 变量的创建(定义)

(1)先定义结构体类型,在创建结构体变量

struct stu   /*定义学生结构体类型*/
{
    char name[20];   /*姓名*/
    int age;        /*年龄*/
    char sex;      /*性别*/
};
struct stu s1,s2;   /*定义结构体变量*/

利用这种定义形式,可以在程序的任何地方,在先定义后使用的原则下,定义属于改结构体类型的变量

(2)定义结构体类型,同时创建结构体变量

struct stu   /*定义学生结构体类型*/
{
    char name[20];   /*姓名*/
    int age;        /*年龄*/
    char sex;      /*性别*/
}s1,s2;    /*同时定义结构体变量*/

将变量直接定义在结构体类型的后面,采用这样的定义方式,在书写上比较紧凑。但对要多处定义结构体变量不方便

(3)通过定义无名结构体类型来定义结构体变量

struct     /*无结构体名*/
{
    char name[20];   
    int age;        
    char sex;      
}s1,s2;    /*同时定义结构体变量*/

但是,由于该定义方式无法记录该结构体的类型,所以,这种定义形式除了直接定义变量外,不能再定义该结构体的其他变量。(这样的定义,使程序的扩展性受到很大限制,所以建议少用这种方式定义结构体变量)

2. 变量的初始化

假设我们要创建两个上面这种结构体类型的变量,并初始化:

(1)按照结构体顺序初始化

struct stu s1 = {"zhangsan",20,'B'};
struct stu s2 = {"wangwu",18,'G'};

(2)按照指定的顺序初始化

其实也就是用到了对结构体成员的引用

struct stu s1 = {.age = 20, .name = "zhangsan", .sex = 'B'};
struct stu s2 = {.age = 18, .name = "wangwu", .sex = 'G'};

当然,在定义结构体类型的同时,创建的结构体变量,也可以同时初始化

struct stu 
{
    char name[20];   
    int age;        
    char sex;    
}s1 = {"zhangsan",20,'B'};

三、结构体成员的引用

第一种 “.” 操作符

对结构体成员的引用我们需要使用到运算符“.”。使用格式:结构体类型变量名.成员名。如:s1.age。每使用一次“.”运算符,其实就是拨开了一层。赋值时,我们需要找到最内层的(能赋值的)成员。

例如:

#include<stdio.h>
struct date
{
    int year;
    int month;
    int day;
};
struct stu
{
    char name[20];
    int age;
    char sex;
    struct date birthday;
};
int main()
{
    struct stu s1 = { "zhangsan",20,'B',{2005,1,1} };
    printf("%d\n", s1.age);
    printf("%d\n", s1.birthday.day);
}

这个程序里的结构体类型stu是内包含一个结构体成员birthday的,所以当我们要引用birthday里面的成员时,我们就需要再用一次“.”运算符:s1.birthday.day

运行结果:

第二种通过指针

结构体指针可以用来访问结构体里面的元素,如:

#include <stdio.h>  

// 定义一个结构体类型  
struct Person {  
    char name[50];  
    int age;  
    float height;  
};  

int main() {  
    // 定义一个结构体变量  
    struct Person person1 = {"Alice", 30, 5.5};  

    // 定义一个指向结构体的指针,并指向person1  
    struct Person *ptr = &person1;  

    // 使用结构体指针访问结构体中的元素  
    printf("Name: %s\n", ptr->name);  
    printf("Age: %d\n", ptr->age);  
    printf("Height: %.1f\n", ptr->height);  

    return 0;  
}

在这个例子中,ptr是一个指向struct Person类型的指针,它指向person1变量。通过ptr->nameptr->ageptr->height,我们可以访问person1结构体中的nameageheight成员。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号