c语言学习笔记——结构体

结构体

定义与遍历

格式:

struct 变量名
{
	类型 变量名;
};
#include<stdio.h>

struct Student
{
	char name[100];
	int age;
};

int main()
{
	//定义三个学生,同时进行赋值
	struct Student stu1 = { "zhang",19 }; 
	struct Student stu2 = { "wang",20 };
	struct Student stu3 = { "zheng",18 };
	//存入数组中
	struct Student stuArr3[3] = { stu1,stu2,stu3 };
	//遍历数组得到每一个元素
	for (int i = 0; i < 3; i++)
	{
		struct Student temp = stuArr3[i];
		printf("name:%s, age:%d\n", temp.name, temp.age);
	}

	return 0;
}

结果:

name:zhang, age:19
name:wang, age:20
name:zheng, age:18
别名
#include<stdio.h>

typedef struct 
{
	//别名
	char name[100];
	int age;
}m;

int main()
{
	//别名:定义两个学生,同时进行赋值
	m aaa = { "one",10 };
	m b = { "two",12 };
	//存入数组中
	m stuArr3[2] = { aaa, b};
	//遍历数组得到每一个元素
	for (int i = 0; i < 2; i++)
	{
		m temp = stuArr3[i];
		printf("name:%s, age:%d\n", temp.name, temp.age);
	}

	return 0;
}
结构体作为函数参数
#include<stdio.h>
#include<string.h>

typedef struct Student
{
	//别名
	char name[100];
	int age;
}m;
void method(m st);
void method2(m* p);
int main()
{
	//定义一个学生
	m stu;
	//赋值
	strcpy(stu.name, "aaa");
	stu.age = 0;
	//输出
	printf("初始数据:%s,%d\n", stu.name, stu.age);//aaa,0
	//
	method(stu);
	printf("method修改后数据:%s,%d\n", stu.name, stu.age);//aaa,0

	method2(&stu);
	printf("method2修改后数据:%s,%d\n", stu.name, stu.age);//aaa,0
	//细节:
	// 如果函数中写的是结构体类型的变量,相当于定义一个新的变量
	//此时把main函数中stu中的数据,传递给了method函数,并把stu中的数据赋值给新的变量st
	//我们在函数中,仅仅修改st中的值,对于main函数中的stu的值没有修改
	//所以不定义新的变量而传递stu的地址
	return 0;
}

void method(m st)
{
	printf("main初始数据:%s,%d\n", st.name, st.age);//aaa,0
	//修改
	printf("请输入要修改的学生名字\n");
	scanf("%s", st.name);
	printf("请输入要的修改学生年龄\n");
	scanf("%d", &(st.age));

	printf("method修改数据:%s,%d\n", st.name, st.age);//输入的
}
void method2(m* p)
{
	printf("main初始数据:%s,%d\n", (*p).name, (*p).age);//aaa,0
	//修改
	printf("请输入要修改的学生名字\n");
	scanf("%s", (*p).name);
	printf("请输入要的修改学生年龄\n");
	scanf("%d", &((*p).age));

	printf("method2修改数据:%s,%d\n", (*p).name, (*p).age);
}
初始数据:aaa,0
main初始数据:aaa,0
请输入要修改的学生名字
asdf
请输入要的修改学生年龄
12
method修改数据:asdf,12
method修改后数据:aaa,0
main初始数据:aaa,0
请输入要修改的学生名字
asdf
请输入要的修改学生年龄
32
method2修改数据:asdf,32
method2修改后数据:asdf,32
结构体嵌套
#include<stdio.h>
#include<string.h>

struct message
{
	char phone[12];
	char mail[100];
};

struct Student
{
	
	char name[100];
	int age;
	char gender;
	double height;
	struct message msg;
};

int main()
{
	//
	struct Student stu;
	strcpy(stu.name, "zhang");
	stu.age = 21;
	stu.gender = 'M';
	stu.height = 1.81;

	strcpy(stu.msg.phone, "12312412424");
	strcpy(stu.msg.mail, "12333245@qq.com");
	//批量赋值
	struct Student stu2 = { "li",32,'F',1.65,{"12132435424","33245@qq.com"} };

	printf("信息:\n");
	printf("name:%s\n", stu.name);
	printf("age:%d\n", stu.age);
	printf("gender:%c\n", stu.gender);
	printf("height:%.2lf\n", stu.height);

	printf("phone:%s\n", stu.msg.phone);
	printf("mail:%s\n", stu.msg.mail);


	printf("2信息:\n");
	printf("name:%s\n", stu2.name);
	printf("age:%d\n", stu2.age);
	printf("gender:%c\n", stu2.gender);
	printf("height:%.2lf\n", stu2.height);

	printf("phone:%s\n", stu2.msg.phone);
	printf("mail:%s\n", stu2.msg.mail);
	return 0;
}

结果:

信息:
name:zhang
age:21
gender:M
height:1.81
phone:12312412424
mail:12333245@qq.com
2信息:
name:li
age:32
gender:F
height:1.65
phone:12132435424
mail:33245@qq.com
结构体内存对齐

内存对齐:
不管是结构体,还是普通的变量都存在内存对齐
规则:
只能放在自己类型整数倍的内存地址上简单理解:
内存地址/占用字节=结果可以整除
举例;
int存放的位置:内存地址—定能被4整除
long long存放的位置:内存地址—定能被8整除;double存放的位置:内存地址—定能被8整除
结构体的内存对齐:
结构体在上面的基础上又多了一条,结构体的总大小,是最大类型的整数倍(用来确定最后一个数据补位的情况)
切记! !
对齐的时候会补空白字节,但是不会改变原本字节的大小char补位之后,本身还是1个字节
心得:
我们会把小的数据类型,写在最上面,大的数据类型,写在最下面(节约空间)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值