结构体总结

news2025/1/12 0:01:26

目录

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.coloradmin.cn/o/561305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_paas

Python PaaS&#xff1a;简介和未来趋势 随着云计算的不断普及&#xff0c;PaaS&#xff08;平台即服务&#xff09;正在成为越来越受欢迎的选择。PaaS可以帮助企业轻松构建、部署和管理应用程序&#xff0c;无需担心底层基础架构的问题。在PaaS领域&#xff0c;Python正在成为…

2023年护网蓝队初级面试总结

00.护网面试步骤是什么样的 投递简历-安全服务公司HR先筛选一下简历&#xff0c;交给技术负责人面试一下&#xff0c;推荐给安全厂商&#xff08;360、奇安信、安恒、绿盟&#xff09; 安全设备厂商HR筛选一下简历&#xff0c;安全设备厂商安排技术笔试和面试&#xff08;技术…

Kubernetes高可用集群二进制部署(Runtime Docker)v1.21版本

Kubernetes高可用集群二进制部署&#xff08;Runtime Docker&#xff09; Kubernetes&#xff08;简称为&#xff1a;k8s&#xff09;是Google在2014年6月开源的一个容器集群管理系统&#xff0c;使用Go语言开发&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xf…

chatgpt赋能Python-python_num怎么用

Python Num怎么用&#xff1f;一个有10年Python编程经验的工程师来告诉你 Python是一种被广泛应用的编程语言&#xff0c;它的发展历程已经超过了20年。而其中的NumPy库则成为了Python编程中最重要的一部分之一。NumPy是一个Python库&#xff0c;它提供了大量针对数字的操作函…

AI宝典:AI超强工具大整合

&#x1f604;&#x1f604;个人介绍 光子郎.进行开发工作七年以上&#xff0c;目前涉及全栈领域并进行开发。会经常跟小伙伴分享前沿技术知识&#xff0c;java后台、web前端、移动端&#xff08;Android&#xff0c;uniapp&#xff0c;小程序&#xff09;相关的知识以及经验体…

微服务实战项目-学成在线-项目介绍以及环境搭建

学成在线-项目介绍&环境搭建 1.项目背景 1.1 在线教育市场环境 以下内容摘自https://report.iresearch.cn/content/2021/01/358854.shtml 在线教育行业是一个有着极强的广度和深度的行业&#xff0c;从校内到校外&#xff1b;从早幼教到职业培训&#xff1b;从教育工具…

Prometheus(普罗米修斯)

Prometheus : 入门 Prometheus简介Prometheus 的主要特点Prometheus架构&#xff1a;什么时候用它合适什么时候用它不合适Prometheus VS InfluxDB基本概念数据模型metric types&#xff08;指标类型&#xff09; Prometheus 安装部署二进制安装部署1、将安装包prometheus-2.6.1…

stable-diffusion-webui(1.2.1版本) win10系统本地电脑部署

在安装stable-diffusion-webui(1.2.1版本)之前需要确认win10本地电脑具有的环境 1.显卡类型&#xff1a;NVIDIA&#xff08;英伟达&#xff09; 建议显存高于4G以上&#xff0c;这样512*512的还是可以运行的 2.python(版本必须最好是3.10.6&#xff09;和 git最新版 正式…

【MySQL高级篇笔记 (上) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、MySQL的数据目录 小结 二 、用户与权限管理 MySQL8密码管理(了解) 权限管理 授予权限的原则 收回权限 权限表 访问控制(了解) 角色管理 三、逻辑架构 服务器处理客户端请求 MySQL 中的 SQL执行流程 SQL语法顺序…

chatgpt赋能Python-python_numpy画图

Python Numpy画图&#xff1a;快速绘制高质量的数据可视化 Python语言不仅在数据科学和人工智能领域得到广泛应用&#xff0c;还被广泛用于数据可视化方面。NumPy是一个Python的科学计算库&#xff0c;提供了高性能的多维数组对象和广播功能&#xff0c;被广泛应用于数据科学、…

Packet Tracer – VLAN 间路由练习

Packet Tracer – VLAN 间路由练习 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 172.17.25.2 255.255.255.252 不适用 G0/1.10 172.17.10.1 255.255.255.0 不适用 G0/1.20 172.17.20.1 255.255.255.0 不适用 G0/1.30 172.17.30.1 255.255.255…

十三、人脸识别

文章目录 1、人脸认证和人脸识别2、One shot学习3、siamese network4、Triplet loss function5、人脸识别和二分类问题THE END 1、人脸认证和人脸识别 \qquad 人脸认证表示输入一幅图片和一个name/ID&#xff0c;输出这个图片和ID是否是同一个人。 \qquad 人脸识别表示数据库中…

OMA通道-3

4 Transport API 传输 API 作为开放移动 API 的一部分&#xff0c;为开放移动设备中可用的 SE 提供通信框架 4.1 概述 传输 API 的作用是为应用程序提供访问设备上可用的 SE 的方法。 提供的访问权限基于 ISO/IEC 7816-4 [ISO 7816-4] 定义的概念&#xff1a; • APDU&#…

WIN提权 烂土豆dll劫持

烂土豆配合令牌劫持提权&#xff08;win2012及以下版本可以尝试&#xff09; 两者配合使用可以直接从web权限提升到system权限 msf反弹后监听 上传文件Potato.exe upload /home/yx/桌面/Potato.exe上传至目标主机目录 烂土豆也很鸡肋 在shell中使用 whoami /priv 查看当…

2023年电工杯报名队伍破万!!!!

截止2023年5月24日凌晨0:56分&#xff0c;刚刚使用账号进行电工杯队伍注册&#xff0c;电工杯报名队伍已经达到10600只队伍&#xff0c;作为本年度上半学年&#xff0c;最后一场大型认可度较高的比赛&#xff0c;本次比赛的时间设置、报名费免费等优势使得&#xff0c;这场比赛…

C++ 图像线特征提取及匹配(LineSegmentMatching)

C++ 线特征提取及匹配【LineSegmentMatching】 1 源码下载2 环境配置2.1 添加预定义设置:2.2.配置项目环境2.1 C/C++ --》常规--》附加包含目录:2.2 链接器-》常规--》附加库目录:2.3 链接器-》常规--》输入:3 编译时踩坑记录4.匹配效果输入两幅图像,分别提取两幅图像中的…

【学习日记2023.5.23】 之 Redis入门未入坑

文章目录 1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍2.2 各种数据类型特点 3…

shell sed命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 sed 命令sed 编辑器sed 的工作流程的三个过程命定格式常用选项常用操作 实验操作打印内容使用地址删除行替换插入 sed 命令 sed 编辑器 sed是一种流编辑器&#x…

什么是 Java 中的数据库连接池?为什么使用连接池来管理数据库连接?

文章目录 1. 数据库连接池的好处1.1 提高性能1.2 连接的重用1.3 连接管理和监控 2. 代码演示2.1 新建maven项目2.2 配置maven地址2.3 配置 Druid 数据源2.4 编写测试代码2.4.1 创建一个 Druid 数据源连接池和获取连接2.4.2 编写测试类2.4.3 新建数据库表2.4.4 运行截图 3. 完整…

进程控制-进程的替换

回顾 对于进程&#xff0c;我们已经有了初步的了解&#xff0c;我们学会了进程的终止&#xff0c;进程的等待&#xff0c;还有如果创建子进程。 这次&#xff0c;我们来学习如何把一个进程运行的代码和数据替换成其他的代码和数据。 进程的替换 为什么要进程替换&#xff0…