C语言——结构体

2023-05-16

结构体

  • 一、定义结构体
  • 二、声明结构体的形式
    • 第一种
    • 第二种
    • 第三种
    • 第四种
    • 第五种
  • 三、结构体的初始化
    • 第一种
      • 运行结果
    • 第二种
      • 运行结果
  • 四、访问结构体成员
  • 五、结构体运算
    • 实例1
      • 运行结果
    • 实例2
      • 运行结果
    • 实例3
      • 运行结果
  • 六、结构体指针
    • 实例1
      • 运行结果
    • 实例2
      • 运行结果

一、定义结构体

使用 struct 语句来定义结构体结构体是一个包含多个成员的数据类型。
struct 语句的格式如下:

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个

符号含义
tag结构体标签
member-list标准的变量定义,比如 int i; 或者 float f 等
variable-list结构体变量,定义在结构体的末尾,最后一个分号之前,可以指定一个或多个结构体变量

二、声明结构体的形式

第一种

// 此声明声明了拥有3个成员的结构体,分别为整型的 x,字符型的 y 和双精度的 z
// 结构体的标签被命名为 point,没有声明变量
struct point {
    int x;
    float y;
    double z;
}; 

// 用 point 标签的结构体,另外声明了变量 p1、p2、p3
struct point p1, p2[10], *p3;

// p1、p2、p3 都是 point, 里面有 x y z 的值

第二种

// 此声明声明了拥有3个成员的结构体,分别为整型的 x,字符型的 y 和双精度的 z
// 同时又声明了结构体变量 p1、p2、p3
// 这个结构体并没有标明其标签
struct {
    int x;
    float y;
    double z;
}p1, p2[10], *p3;

// p1、p2、p3 都是一种无名结构体, 里面有 x y z

第三种

// 此声明声明了拥有3个成员的结构体,分别为整型的 x,字符型的 y 和双精度的 z
// 同时又声明了结构体变量 p1、p2、p3
// 结构体的标签被命名为 point
struct point {
    int x;
    float y;
    double z;
}p1, p2, p3;
// p1、p2、p3 都是 point, 里面有 x y z 的值

第一种和第三种形式,都声明了结构体 point,但第二种形式没有声明 point,只是定义了三个变量

第四种

// 结构体的成员包含其他结构体,或包含指向自己结构体类型的指针

// 此结构体的声明包含了其他的结构体
struct COMPLEX
{
    char string[100];
    struct SIMPLE a;
};
 
// 此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
};

第五种

// 两个结构体互相包含

struct B;    // 对结构体B进行不完整声明
 
// 结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
 
// 结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

三、结构体的初始化

第一种

#include <stdio.h>

struct date {
    int month;
    int day;
    int year;
}today = { 3,28,2022 }, thismonth = { .month = 3, .year = 2022 };

int main()
{
    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("This month is %d-%d-%d.\n",
        thismonth.year, thismonth.month, thismonth.day);

    return 0;
}

运行结果

在这里插入图片描述

第二种

#include <stdio.h>

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

int main()
{
    struct date today = { 3,28,2022 };
    struct date thismonth = { .month = 3, .year = 2022 };
    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("This month is %d-%d-%d.\n",
        thismonth.year, thismonth.month, thismonth.day);
        
    return 0;
}

运行结果

在这里插入图片描述

四、访问结构体成员

  • 结构体用成员访问运算符(.)变量名访问其成员。
  • 要访问整个结构体,直接用结构体变量的名字

五、结构体运算

对于整个结构体,可以做以下运算:赋值、取地址、传递给函数作为参数(传参方式与其他类型的变量或指针类似)。下面的实例1、2、3 表达的结果是一致的,只是表达方式有所不同。

实例1

#include <stdio.h>

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

int main()
{
    struct date today = { 3,28,2022 };
    struct date day;
    day = today;
    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("The day is %d-%d-%d.\n",
        day.year, day.month, day.day);

    return 0;
}

运行结果

在这里插入图片描述

实例2

#include <stdio.h>

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

int main()
{
    struct date today;
    today = (struct date){ 3, 28, 2022 };
    struct date day;
    day = today;
    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("The day is %d-%d-%d.\n",
        day.year, day.month, day.day);

    return 0;
}

运行结果

在这里插入图片描述

实例3

#include <stdio.h>

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

int main()
{
    struct date today;
    today.month = 3;
    today.day = 28;
    today.year = 2022;
    struct date day;
    day.month = today.month;
    day.day = today.day;
    day.year = today.year;
    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("The day is %d-%d-%d.\n",
        day.year, day.month, day.day);

    return 0;
}

运行结果

在这里插入图片描述

六、结构体指针

数组不同,结构体变量的名字并不是结构体变量的地址,必须使用 & 运算符

struct date* pDate = &today;

实例1

#include <stdio.h>

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

int main()
{
    struct date today;
    today = (struct date){ 3, 28, 2022 };
    struct date day;
    day = today;
    struct date* pDate = &today;

    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("The day is %d-%d-%d.\n",
        day.year, day.month, day.day);
    printf("address of today is %p\n", pDate);

    return 0;
}

运行结果

在这里插入图片描述

实例2

#include <stdio.h>

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

int main()
{
    struct date today;
    today = (struct date){ 3, 28, 2022 };
    struct date day;
    day = today;
    struct date* pDate = &today;

    printf("Today's date is %d-%d-%d.\n",
        today.year, today.month, today.day);
    printf("The day is %d-%d-%d.\n",
        day.year, day.month, day.day);
    printf("address of today is %p\n", pDate);
    printf("pDate(today) is %d-%d-%d.\n",
        (*pDate).year, (*pDate).month, (*pDate).day);
    printf("pDate(today) is %d-%d-%d.\n",
        pDate->year, pDate->month, pDate->day);
    // 用 -> 表示指针所指的结构体变量中的成员
    
    return 0;
}

运行结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——结构体 的相关文章

随机推荐

  • C语言知识总结:a++ 与 ++a 的区别、return 0和return 1的区别、逗号表达式计算规则、数据类型占用字节数、赋值运算符

    C语言知识总结 一 C语言中a 43 43 与 43 43 a 的区别二 C语言中return 0和return 1的区别三 逗号表达式计算规则四 常用基本数据类型占用空间 xff08 64位机器为例 xff09 五 C语言中的赋值运算符
  • C语言printf()函数

    函数printf 中 xff0c md指输出带符号的十进制整数 xff0c 给定最小宽度为m位 xff0c 不足m位左端补空格 xff0c 超过m位按实际位数输出 xff0c m nf表示以小数形式输出实数 xff0c 最小宽度为m位 xf
  • 栈和队列知识点总结

    栈和队列知识点总结 一 栈 入栈与出栈二 循环队列 入队与出队三 栈的存储空间为S 1 m xff0c 初始状态为top 61 m 43 1四 带链的栈和带链的队列五 线性链表 存储空间不连续六 线性结构与非线性结构 判断准则 一 栈 入栈
  • 原码、反码和补码

    1 原码 原码就是符号位加上真值的绝对值 即用第一位表示符号 其余位表示值 比如如果是8位二进制 xff1a span class token punctuation span span class token operator 43 sp
  • Win10点击声音图标打不开音量调节的解决方法

    Win10点击声音图标打不开音量调节 一 问题描述二 解决方法 一 问题描述 Win10系统声音图标显示正常 xff0c 但是点击声音图标无法打开音量调节 二 解决方法 快捷键 Win 43 X 43 T 或鼠标右击任务栏打开任务管理器 找
  • C语言中exit(0) 、exit(1) 和return的区别

    C语言中的exit 文字描述代码验证return 表示返回 xff0c 函数返回exit 表示程序退出exit 0 表示正常退出 xff0c 代码为1exit 1 表示异常退出 xff0c 代码为1 文字描述 return是语言级别的 xf
  • 数组的地址、指针的使用、数组名加1的含义、数组的集成初始化、数组的大小、数组的赋值

    数组与指针 一 数组的地址实例1运行结果实例2运行结果 二 指针的使用实例1运行结果实例2运行结果 三 数组名加1的含义实例1运行结果实例2运行结果 四 数组的集成初始化实例1运行结果实例2运行结果实例3运行结果 五 数组的大小实例运行结果
  • 感想京东

    xfeff xfeff 现在网上购物已经是家常便饭 xff0c 大多数人们都已接受了网购这种方式 xff0c 而能够给人们提供网购的网站也很多 xff0c 而我从好几年前就开始在京东网购物了 xff0c 因此京东商城的每一次发展 xff0c
  • 指针常量与常量指针的区别、const 数组

    指针常量与常量指针 const 数组 一 指针常量指针本身是常量 二 常量指针指向常量的指针 三 实例四 const 数组 一 指针常量 指针本身是常量 span class token comment 指针本身不能被修改 span spa
  • 动态内存的分配

    实例 span class token macro property span class token directive keyword include span span class token string lt stdio h gt
  • 指向数组的指针

    实例 span class token macro property span class token directive keyword include span span class token string lt stdio h gt
  • 指针数组的含义

    实例1 span class token macro property span class token directive keyword include span span class token string lt stdio h g
  • 二维数组的使用

    实例1 二维数组遍历 span class token macro property span class token directive keyword include span span class token string lt st
  • C语言scanf()函数

    scanf 函数输出格式为 xff1a flags type scanf 函数从输入设备按照指定的类型输入对应类型的若干个数据 xff0c 遇到空格 制表符和回车时 xff0c 读取结束 和字母中间的数字表示最多允许读入的数量 scanf
  • 字符数组与字符串

    字符数组与字符串 一 字符串实际上是使用空字符 39 0 39 结尾的一维字符数组 二 字符数组实例运行结果 三 字符串实例运行结果 四 字符串的定义如果要构造一个字符串 用指针定义如果要处理一个字符串 用数组定义实例运行结果 五 字符串赋
  • C语言的输入、输出

    C语言的输入与输出 一 scanf 和 printf 函数实例运行结果 二 getchar 和 putchar 函数实例1运行结果实例2运行结果 三 gets 和 puts 函数实例运行结果 一 scanf 和 printf 函数 实例 s
  • C语言中操作字符串的函数

    C语言中操作字符串的函数 一 函数表二 strlen实例运行结果 三 strcmp实例运行结果 四 strcpy实例运行结果 五 stract实例运行结果 六 strchr实例运行结果 七 strstr 一 函数表 函数名函数功能strle
  • C语言—枚举

    枚举 枚举是一种用户定义的数据类型 xff0c 它用关键字 enum 以如下语法来声明 xff1a span class token keyword enum span 枚举类型名字 span class token punctuation
  • 将tensorflow训练好的模型移植到android

    将tensorflow训练好的模型移植到android上 说明 本文将描述如何将一个训练好的模型植入到android设备上 xff0c 并且在android设备上输入待处理数据 xff0c 通过模型 xff0c 获取输出数据 通过一个例子
  • C语言——结构体

    结构体 一 定义结构体二 声明结构体的形式第一种第二种第三种第四种第五种 三 结构体的初始化第一种运行结果 第二种运行结果 四 访问结构体成员五 结构体运算实例1运行结果 实例2运行结果 实例3运行结果 六 结构体指针实例1运行结果 实例2