首页 > 其他分享 >C基础:结构体 struct

C基础:结构体 struct

时间:2024-08-02 09:53:55浏览次数:8  
标签:定义 int age 基础 student 结构 struct

目录

1.结构体基本用法

1.1 定义

1.2结构体定义格式

1.3 结构体变量

1.3.1 概念

1.3.2 定义格式

1.3.3 定义结构体变量的方式

1.3.4 结构体变量赋值

1.5.3 访问结构体成员变量

1.4 重定义 typedef

1.4.1 基本用法

1.4.2 定义结构体的同时重定义

1.4.3 先定义结构体,然后重定义

2.结构体数组

2.1概念

2.2 定义格式

2.3 初始化

2.4 结构体数组输入输出(for循环)

3.结构体指针

3.1 概念

3.2 定义格式

3.3 结构体指针所指变量中的成员赋值

3.4 大小

3.5 结构体内结构体

4.结构体大小以及对其原则

4.1 结构体大小可以用哦个sizeof得出

4.2 字节对齐原则

4.3 节省空间原则

1.结构体基本用法

1.1 定义

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。

使用结构体的好处:

1.    结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。

2.    为函数间传递不同类型的数据提供了方便。

1.2结构体定义格式

struct 结构体名

{

数据类型 成员变量名1;

数据类型 成员变量名2;

数据类型 成员变量名3;

...

};

举例:

struct student
{
    char name[32];
    int age;
    float score;
};

定义了一个名字叫student的结构体数据类型,里面成员有三个分别是name,age和score。

1.3 结构体变量

1.3.1 概念

通过结构体类型定义的变量

1.3.2 定义格式

struct 结构体名 变量名;

1.3.3 定义结构体变量的方式

  1. 先定义结构体,再定义结构体变量

struct 结构体名

{

成员变量;

};

struct 结构体名 变量名;

例如:

struct student s1;

  1. 定义结构体的同时定义结构体变量

struct 结构体名

{

成员变量;

}变量名1, 变量名2;

例如:

struct student
{
    char name[32];
    int age;
}s1,s2;

定义了一个叫student结构体数据类型的同时,用该类型定了两个叫s1和s2的变量。

也可以用缺省结构体名:

struct

{

成员变量;

} 变量名;

1.3.4 结构体变量赋值

先定义一个结构体:

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

(1)定义结构体变量时直接使用花括号赋值

struct student s1 = {"xiaoming", 1, 18};

(2)定义结构体变量时用点等法赋值

struct student s2 =

{

.name ="xiaofang",

.id = 2,

.age =18

};

(3)定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符. 。

struct student s3;

s3.id=3;

s3.age=19;

strcpy(s3.name, "xiaowang");

1.5.3 访问结构体成员变量

通过.访问: 结构体变量名.成员变量名

例子:

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

struct student
{
    char name[32];
    int id;
    int age;
} s1, s2;     //定义结构体类型student的同时定义结构体变量s1和s2

int main()
{
    struct student s3 = {"xiaoliu", 1, 19};  //用struct student类型定义变量s3的同时给每个成员赋值
    struct student s4 = {
        .name = "xiaozhang",
        .id = 2,
        .age = 18};

    struct student s5;   //先定义结构体变量s5, 然后访问每个成员的方式赋值
    s5.id = 3;
    s5.age = 290;
    strcpy(s5.name, "yaojing");

    printf("%s %d %d\n", s3.name, s3.id, s3.age);
    printf("%s %d %d\n", s4.name, s4.id, s4.age);
    printf("%s %d %d\n", s5.name, s5.id, s5.age);
}

1.4 重定义 typedef

给数据类型另起名字

1.4.1 基本用法

例如:

typedef int size_t;

此时:int a; 可以写成 size_t a;

总而言之,用数据类型定义变量时变量名写在哪,用typedef重命名时新名字就写在哪然后前面加个typedef就可以了。使用新名字定义变量时直接:新名字 变量名;

1.4.2 定义结构体的同时重定义

typedef struct flower
{
    char name[32];
    char color[32];
} FLOWER;

FLOWER f1;  //等同于 struct flower f1;
struct flower f2;
也可以省略结构体名

1.4.3 先定义结构体,然后重定义

struct flower
{
    char name[32];
    char color[32];
};

typedef struct flower FLOWER;
FLOWER f1;  //等同于 struct flower f1;

2.结构体数组

2.1概念

结构体类型相同的变量组成的数组

2.2 定义格式

1.定义结构体的同时定义结构体数组

struct student
{
    int id;
    int age;
} s[5];

2.先定义结构体,然后定义结构体数组

struct student
{
     int id;
     int age;   
};
struct student s[5];

2.3 初始化

1.定义结构体数组同时赋值

struct student
{
    int id;
    int age;
};
struct student s[3] = {
    {1, 19},
    {2, 20},
    {3, 18}};
2.先定义结构体数组,再对数组的每一个元素中的每个结构体成员分别赋值。
#include <stdio.h>
#include <string.h>

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

int main()
{
    struct student s[3];
    strcpy(s[0].name, "xiaoliu");
    s[0].id = 1;
    s[0].age = 19;

    strcpy(s[1].name, "xiaowang");
    s[1].id = 2;
    s[1].age = 18;

    printf("%s %d %d\n", s[0].name, s[0].id, s[0].age);
    printf("%s %d %d\n", s[1].name, s[1].id, s[1].age);
}

2.4 结构体数组输入输出(for循环)

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

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

int main()
{
    struct student s[3];

    for (int i = 0; i < 3; i++)
        scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);

    for (int i = 0; i < 3; i++)
        printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}

3.结构体指针

3.1 概念

指向结构体变量的指针

3.2 定义格式

struct 结构体名 *结构体指针名;

3.3 结构体指针所指变量中的成员赋值

通过指向结构体变量的指针间接的去访问其中的成员:

格式: 指针变量名 -> 成员变量名

p->id =1;

p->age =19;

strcpy(p->name,"li");

或者:(*p).id=2; //不常用

3.4 大小

本质还是指针,8字节。(32位系统4字节)

3.5 结构体内结构体

如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量

关于结构体总结:

1.    不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用

2.    如果成员变量本身属于另一种结构体类型,用若干个成员运算符.一级级找到最低级的成员变量

3.    可以把成员变量当成普通变量运算

4.结构体大小以及对其原则

4.1 结构体大小可以用哦个sizeof得出

sizeof(struct 结构体名);

或者

sizeof(结构体变量名);

结构体数组: 结构体类型大小*元素个数

sizoef(数组名);

4.2 字节对齐原则

例如:

struct stu

{

char a;

int c;

char b;

}; //sizeof(struct stu) 等于12

struct stu

{

char a;

char b;

int c;

}; //sizeof(struct stu) 等于8

  1. 第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。
  2. 用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。

4.3 节省空间原则

为了减少空间浪费,把占用空间小的成员集中到一起。

总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。

标签:定义,int,age,基础,student,结构,struct
From: https://blog.csdn.net/thh135/article/details/140771580

相关文章

  • 深入理解C语言中的结构体
    目录引言一.结构体的基本概念1.结构体的声明2.结构体变量的创建和初始化3.结构体成员访问操作符4.结构体的特殊声明1.匿名结构体2.嵌套结构体3.结构体自引用4.typedef声明二、结构体内存对⻬1.对⻬规则2.为什么存在内存对⻬?3.修改默认对齐数三、结构体......
  • Java流程控制语句结构中的循环结构
    循环结构目录循环结构while循环do...while循环for循环如果您想要同样的操作执行多次,就需要使用循环结构。Java中有三种主要的循环结构:while循环do…while循环for循环while循环while是最基本的循环,它的结构为:while(布尔表达式){//循环内容}只要布尔表达式......
  • 数据结构实验----邻接表和拓扑排序
    一.实验目的1.理解拓扑排序的特性和算法;2.通过构造图的邻接表,掌握拓扑排序算法。二.实验内容1.建立邻接表存储的图;2.对图进行拓扑排序;3.输出拓扑排序序列。三.代码#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAXSIZE10#defineOK1#......
  • 数据结构实验---散列表
    一.实验目的1.理解散列表的存储结构;2.掌握常用散列函数构造方法和处理冲突方法;3.在散列表上实现查找的算法。二.实验内容为小于n个关键字设计一个散列表,使得查找成功时平均查找长度<2.0,要求完成相应的散列表建立和查找。假设关键字为整型数据,散列函数用除留余数法,采用开放......
  • HTML基础笔记
    1.HTML语法规范1.1基本语法概述1.HTML标签是由尖括号包围的关键词,例如<html>2.HTML通常是成对出现的,叫做双标签,分别是开始标签,结束标签。<html></html>3。有些特殊的标签必须是单标签。<br/>1.2标签关系双标签关系可以分为两类:包含关系和并列关系。<html><head......
  • 离散意义下的基础概率与期望
    定义概率:某个随机事件出现的可能性大小。事件\(A\)发生的概率记作\(P(A)\),其取值范围为\([0,1]\)。期望:若\(X\)是一个离散型的随机变量,可能的取值为\(x_1,x_2,\dots,x_n\),对应的概率分别为\(p_1,p_2,\dots,p_n\),那么它的期望值为\(\sum_{i=1}^np_ix_i\)。随机变......
  • 结构体调用
    文章目录前言引言环境说明图片说明x86汇编简易说明主要参考文件结构体调用MSVC编译器步骤测试说明设置断点汇编代码函数调用结构体访问MinGW编译器步骤测试项目编译汇编代码GCC编译器步骤测试项目编译汇编代码结论前言引言由于开发AT芯片进行脉冲计数时发现......
  • 白盒测试基础与实践:Python示例及流程图设计
    文章目录前言一、白盒测试是什么?主要特点常用方法优点缺点二、白盒测试常用技术语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖三、程序流程图设计四、测试用例设计1.基本路径法2.语句覆盖3.判断覆盖4.条件覆盖5.判断/条件覆盖6.条件组合覆盖总结......
  • taro基础使用
     taro官网:Taro介绍|Taro文档首先,你需要使用npm或者yarn全局安装 @tarojs/cli,或者直接使用 npx:#使用npm安装CLI$npminstall-g@tarojs/cli定义路由exportdefaultdefineAppConfig({pages:['pages/index/index','pages/my/index','......
  • [Java基础]Integer
    在Java中,Integer类会对一些数值进行缓存,这样可以节省内存并提高性能。当你使用Integer.valueOf(int)方法来创建Integer对象时,对于数值在-128到127之间的整数,Java会返回缓存中的对象实例。因此,对于这些范围内的整数,用Integer.valueOf创建的Integer对象实际上会引用同......