结构体总结

news/2024/10/30 11:26:59/

目录

1.普通结构体

2.定义结构体并同时建立变量

3.匿名结构体

 4.typedef重命名

5.typedef省略结构体名字

6.结构体数组

 7.结构体指针

8.结构体嵌套

 9.结构体链表(头插法)

 10.结构体中的函数指针

 11.结构体的构造函数和初始化列表


1.普通结构体

struct   name(结构体名){

        结构体成员

};

#include <stdio.h>
struct node
{int a;char *b;
};int main(int argc, char const *argv[])
{struct node n;n.b="abcdefg";n.a=100;printf("%s\n%d\n",n.b,n.a);return 0;
}

2.定义结构体并同时建立变量

struct   name(结构体名){

        结构体成员

}实例变量;

#include <stdio.h>
struct node
{int a;char *b;
}n,nn;int main(int argc, char const *argv[])
{n.b="abcdefg";n.a=100;printf("%s\n%d\n",n.b,n.a);return 0;
}

3.匿名结构体

struct{

        结构体成员

}实例变量;

#include <stdio.h>
struct
{int a;char *b;
}n,nn;int main(int argc, char const *argv[])
{n.b="abcdefg";n.a=100;printf("%s\n%d\n",n.b,n.a);return 0;
}

 4.typedef重命名

typedef  struct   name1结构体名){

        结构体成员

}name2(重新定义的名字);

name2=struct name1

#include <stdio.h>
typedef struct node
{int a;char *b;
}node;int main(int argc, char const *argv[])
{node n;n.b="abcdefg";n.a=100;printf("%s\n%d\n",n.b,n.a);return 0;
}

5.typedef省略结构体名字

typedef  struct {

        结构体成员

}name2(重新定义的名字);

#include <stdio.h>
typedef struct
{int a;char *b;
}node;int main(int argc, char const *argv[])
{node n;n.b="abcdefg";n.a=100;printf("%s\n%d\n",n.b,n.a);return 0;
}

6.结构体数组

和创建普通数组一样创建结构体数组即可

#include <stdio.h>
typedef struct node
{int a;char *b;
}node;int main(int argc, char const *argv[])
{node n[10];for(int i=0;i<10;i++){n[i].a=i*i;n[i].b="zbcdef";}for(int i=0;i<10;i++){printf("%d\t%s\n",n[i].a,n[i].b);}return 0;
}

 7.结构体指针

extern void *malloc(unsigned int num_bytes);

首先定义一个结构体指针,但此时只是分配了一个地址,结构体成员变量并没有分配空间,因此使用malloc函数动态分配地址, 返回值是一个void*,因此要强转成你要的类型指针。

结构体成员变量赋值:

假如n是一个结构体指针,*n就是这个实际结构体,  (*n).成员名   就可以给结构体成员赋值或者更改,此外C语言为了简便,单独规定了结构体指针的定义方式  n->成员名。两种都是可以的;

#include <stdio.h>
typedef struct
{int a;char*  b;
}node;int main(int argc, char const *argv[])
{node *n=(node*)malloc(sizeof(node));(*n).b="abcdefg";(*n).a=100;printf("%s\n%d\n",(*n).b,(*n).a);return 0;
}
#include <stdio.h>
typedef struct
{int a;char*  b;
}node;int main(int argc, char const *argv[])
{node *n=(node*)malloc(sizeof(node));n->b="abcdefg";n->a=100;printf("%s\n%d\n",n->b,n->a);return 0;
}

8.结构体嵌套

结构体的成员变量当然可以包含结构体了

#include <stdio.h>
typedef struct student
{char* name;int age;int chengji;
}student;typedef struct school_class
{student std[3];char* t_name;int t_age;}school_class;int main(int argc, char const *argv[])
{school_class *n=(school_class*)malloc(sizeof(school_class));n->t_name="曹老师";n->t_age=21;n->std[0].name="小明";n->std[0].age=18;n->std[0].chengji=500;n->std[1].name="小张";n->std[1].age=17;n->std[1].chengji=600;n->std[2].name="小红";n->std[2].age=18;n->std[2].chengji=700;printf("老师信息:\n%s\t%d\n",n->t_name,n->t_age);for(int i=0;i<3;i++){printf("学生%d信息:\n",i);printf("%s\t%d\t%d\n",n->std[i].name,n->std[i].age,n->std[i].chengji);}return 0;
}

 9.结构体链表(头插法)

链表就是结构体的指针指向下一个结构体,其存储不连续,是分布式的,因此读取速度相对数组来说慢的多。定义一个结构体,其结构体成员变量中包括本身的一个结构体指针,因此可以给该结构体变量赋值,赋的值又是一个结构体指针,里面又有一个结构体指针类型的结构体成员,以此类推产生链表。C++的STL库有list库,使用十分方便;

#include"stdlib.h"
#include"stdio.h"
static int wei=1;
typedef struct Node 
{char data[15]; struct Node* next;
}node;
node* head;
void Insert()
{node* p=(node*)malloc(sizeof(node));char buff[10];sprintf(buff,"我是第%d个元素!",wei);int i=0;while(buff[i]!='\0'){p->data[i]=buff[i];i++;}p->data[i]='\0';p->next=head;wei++;head=p;}void Print()
{node* p=head;while(p!=NULL){printf("%s\n",p->data);p=p->next;}
}//自定义打印函数(Print)int main()
{head=NULL;for(int i=0;i<5;i++){Insert();}Print();
}

 

 10.结构体中的函数指针

#include <stdio.h>
typedef struct Node{int x;int y;int (*cheng)(int x,int y);
}node;int cheng_1(int x,int y){return x*y;
}
int main(){node m;m.x=10;m.y=9;m.cheng=cheng_1;printf("%d\n",m.cheng(m.x,m.y));return 0;
}

 

 11.结构体的初始化列表

#include <iostream>
using namespace std;
struct node{int age;string name;int weight;int height;node(string name_1="曹XX",int age_1=18,int weight_1=120,int height_1=180){name=name_1;age=age_1;weight=weight_1;height=height_1; }
};
int main(){node cao("曹仙人",22,123,185);cout<<cao.name<<' '<<cao.age<<' '<<cao.height<<' '<<cao.weight<<endl; return 0;
}

 12.结构的的构造函数

#include <iostream>
using namespace std;
struct node{string name;int age;int weight;int height;node():name("曹仙人"),age(22),weight(120),height(190){cout<<"构造函数"<<endl; } ~node(){cout<<"析构函数"<<endl; }
};
int main(){node t;cout<<t.name<<' '<<t.age<<' '<<t.weight<<' '<<t.height<<endl;return 0;
}

 

 


http://www.ppmy.cn/news/84201.html

相关文章

小白入门SRC漏洞挖掘的正确姿势

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…

Linux:Firewalld防火墙

Linux&#xff1a;Firewalld防火墙 一、Firewanlld防火墙概述二、Firewalld和Iptables的关系三、Firewalld网络区域3.1 Firewalld 区域的概念&#xff1a;3.2 firewalld防火墙预定义了9个区域3.3 firewalld数据处理流程 四、Firewalld防火墙的配置方法五、Firewalld-config图形…

计算机组成原理知识点

循环冗余校验码是什么&#xff1f;多项式除法呢&#xff1f;数据信息如何利用多项式除法进行计算&#xff1f; ChatGPT: 循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff0c;CRC&#xff09;是一种在数据传输过程中常用的错误检测技术。它通过在发送数据时添加冗余…

云原生之部署Docker管理面板SimpleDocker

云原生之部署Docker管理面板SimpleDocker 一、SimpleDocker介绍1. SimpleDocker简介2. SimpleDocker特点 二、本地环境介绍1. 本地环境规划2. 本次实践介绍 三、本地环境检查1.检查Docker服务状态2. 检查Docker版本3.检查docker compose 版本 四、下载SimpleDocker镜像五、部署…

调用百度API自动生成春联

目录 1、作者介绍2、百度智能春联介绍录2.1 功能介绍2.2 技术特色 3、智能春联API接口介绍3.1 请求参数3.2 返回参数 4. 操作流程5. 代码实现 1、作者介绍 范宇帅&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;多机器人协…

《Redis-Linux平台下Redis集群的使用》

文章目录 Redis集群1.单机安装Redis2.Redis主从集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.开启主从关系2.5.测试3.搭建哨兵集群3.1.集群结构3.2.准备实例和配置3.3.启动3.4.测试4.搭建分片集群4.1.集群结构4.2.准备实例和配置4.3.启动4.4.创建集群4.5.测试Redis集群 基于…

【软考-中级】系统集成项目管理工程师 【13合同管理】

持续更新。。。。。。。。。。。。。。。 【第十三章】合同管理 2 分 考点 1考点 2考点 3考点4:成本补偿合同考点5:工料合同考点6:合同类型的选择考点 7考点 8:合同管理包括考点9考点 10考点 11考点 12考点 13考点 14考点 15历年真题2022 年 05 月2021 年 11 月2021 年 05 月 考…

第四十八天学习记录:工作相关:Qt resizeEvent 的诡异问题

今天&#xff0c;在做一个新项目时&#xff0c;发现一个诡异的问题。 在软件初次打开的时候&#xff0c;会调用一次resizeEvent(QResizeEvent *sizechangeevent)函数来对主界面控件大小以及位置进行一次调整。 但由于窗口在设计的时候用的一个大小&#xff0c;而在打开软件后…