复习_回顾_总结_struct_结构体(详解)


结构体


1.1 为什么要使用“结构”(结构体)

但需要表示一些复杂信息时,使用单纯的数据类型很不方便。
比如:学生信息(学号,姓名,班级,电话,年龄)

1.2 什么是“结构”

结构,就是程序员自定义的一种“数据类型”
是使用多个基本数据类型、或者其他结构,组合而成的一种新的“数据类型”。

1.3 结构体的定义

struct 结构名 {
成员类型 成员名;
成员类型 成员名;
};

实例:

struct student{
	char name[16];
	int age;
	char tel[12];
};

特别注意:
1)要以 struct 开头
2)最后要使用分号
3)各成员之间用分号隔开

1.4 结构的初始化

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

//结构, 就是程序员自定义的一种"数据类型"
struct student{
	char name[16];
	int age;
	char tel[12];
};

//结构体包含结构体的情况
struct _class{
	struct student weifc;
	struct student weimk;
	struct student weikc;
};

int main(){
	//结构体的初始化
	//方式一 定义的时候初始化所有的属性
	struct student weifc = {"weifc", 19, "10086"};

	printf("rock 的姓名: %s 年龄: %d 电话: %s\n", weifc.name, weifc.age, weifc.tel);

	//方式二 定义的时候我们可以指定初始化的属性vs/vc不支持 gcc支持
	//struct student s1 ={.name="张三丰",.age = 100};

	//方式三 单独初始化每一个属性
	struct student s2;
	strcpy(s2.name, "杨过");
	s2.age = 40;
	s2.tel[0] = '\0';

	printf("杨过的姓名: %s 年龄: %d 电话: %s\n", s2.name, s2.age, s2.tel);

	struct _class c1 = {{"weifc", 19, "*****"},
						{"weimk", 20, "*******"},
						{"weikc", 100, ""}};

	printf("c1班weifc 同学姓名: %s 年龄: %d 电话: %s\n",
		c1.weifc.name, c1.weifc.age, c1.weifc.tel);

	system("pause");
	return 0;
}

使用形式:
结构体变量.成员变量
中间用 . 分隔

运行结果:
在这里插入图片描述

1.5 结构的使用

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

struct student{
	char name[16];
	int age;
};

int main(){
	struct student s1, s2;

	printf("请输入第一个学生的姓名: \n");
	scanf_s("%s", s1.name, sizeof(s1.name));
	printf("请输入第一个学生的年龄: \n");
	scanf("%d", &s1.age);

	printf("第一个学生的姓名: %s, 年龄: %d\n", s1.name, s1.age);

	//结构体的小秘密, 结构体变量之间可以直接赋值
	//s2 = s1;
	memcpy(&s2, &s1, sizeof(struct student));
	printf("第二个学生的姓名: %s, 年龄: %d\n", s2.name, s2.age);
	char c1[16] = {"weifc"}, c2[16];
	//c2 = c1; 数组不能直接赋值

	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

2.6 结构数组

struct 结构名 变量名[数组大小]

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

struct student{
	char name[16];
	int age;
};

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

	printf("请输入第一个学习姓名: \n");
	scanf_s("%s", s[0].name, sizeof(s[0].name));
	printf("请输入第一个学生的年龄: \n");
	scanf("%d", &s[0].age);

	printf("第一个学生的姓名: %s, 年龄: %d\n", s[0].name,s[0].age);

	//结构体的小秘密, 结构体变量之间可以直接赋值
	s[1] = s[0]; //方式1
	//memcpy(&s[1], &s[0], sizeof(struct student)); //方式二
	printf("第二个学生的姓名: %s, 年龄: %d\n", s[1].name,s[0].age);

	system("pause");
	return 0;
}

1.7 指向结构体的指针

使用结构体变量址指针访问结构体成员要使用 -> 符号

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

struct _friend{
	char name[32];
	char sex; // m - 男 f - 女
	int age;
};

int main(void){
	struct _friend girl = {"小龙女", 'f', 18};

	struct _friend *my_girl = &girl;

	printf("小龙女的名字: %s 性别: %s 年龄: %d\n", 
		girl.name,girl.sex=='m'?"男":"女", girl.age);

	//指针访问结构体变量的成员, 有两种方式
	//方式1. 直接解引
	printf("小龙女的姓名: %s 性别: %s 年龄: %d\n", (*my_girl).name,
		(*my_girl).sex=='m'?"男":"女", (*my_girl).age);

	//方式2. 直接使用指针访问 ->
	printf("小龙女的姓名: %s 性别: %s 年龄: %d\n", my_girl->name,
		my_girl->sex=='m'?"男":"女", my_girl->age);

	system("pause");
	return 0;
}

***实际开发中***常用 -> 符通过指针去访问结构体指针变量的成员
运行结果:
在这里插入图片描述

1.8 使用结构体传递值

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

struct programer{
	char name[32];
	int age;
	int salary;
};

//形参是结构体变量, 值传递
struct programer add_salary(struct programer p, int num){
	p.salary += num;
	return p;
}

//形参使用结构体指针
void add_salary1(struct programer *p, int num){
	if(!p) return;

	p->salary += num;
}

//形参使用引用
void add_salary2(struct programer &p, int num){
	p.salary += num;
}

//形参是结构体变量, 值传递, 返回引用
struct programer& add_salary3(struct programer p, int num){
	p.salary += num;
	return p;
}

int main(void){
	struct programer xiaoniu;

	strcpy(xiaoniu.name, "小牛");
	xiaoniu.age = 28;
	xiaoniu.salary = 20000;

	//结构体变量做为参数传值是值传递, 和int 等基本类型一样
	//xiaoniu = add_salary(xiaoniu, 5000);

	//指针传值
	//add_salary1(&xiaoniu, 5000);

	//引用传值
	//add_salary2(xiaoniu, 10000);

	//返回引用
	xiaoniu = add_salary3(xiaoniu, 20000);

	printf("姓名: %s, 年龄: %d, 薪资: %d\n", xiaoniu.name, 
		xiaoniu.age, xiaoniu.salary);

	system("pause");
	return 0;
}

注意:
一般不建议把结构体直接作为函数参数。
因为结构体的 size 比较大,直接传递,消耗性能!
解决方案:(使用指针和引用,优先使用引用)

运行结果:
在这里插入图片描述

结语:

大家对学到的知识要, 多复习, 多总结, 多敲.

我是小白, 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weifc-wei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值