目录

为什么会出现结构体

什么叫结构体

如何使用结构体

结构体使用的注意事项


为什么会出现结构体

我们需要复杂的数据组合在一起形成一个新的数据类型来表示复杂的数据,普通的基本变量无法满足要求。

Java 的类(class)与 C 的结构体(struct)的区别就在于是否存在方法(函数),所谓的类就是把属性和方法结合在一起放在类里面,而结构体就只有个属性的定义而已。所以说类能够更好的表示一个事物,而结构体来表示事物是有缺陷的,结构体可以看做是向类的一个过渡。

什么叫结构体

C 语言中的结构体是用户根据自己需要定义的复合数据类型。

Java 中的类说白了也是一种数据类型。

如何使用结构体

方式一:st.sid

方式二:pst->sid(pst所指向的结构体变量中的sid这个成员)

pst->sid 等价于 (*pst).sid 等价于 st.sid

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

struct Student  // 定义了一个新的数据类型叫 struct Student
{
	int sid;        // 成员1
	char name[200]; // 成员2
	int age;        // 成员3
};


int main(void)
{
	struct Student st;
	// 结构体类型数据赋值方式一
	st = { 1000,"zhangsan",20 };
	printf("%d %s %d\n", st.sid, st.name, st.age);

	// 结构体类型数据赋值方式二
	st.sid = 2000;
	st.age = 22;
	// st.name = "lisi";  // 注意 C 语言的字符串不能够直接赋值
	strcpy_s(st.name, "lisi");
	printf("%d %s %d\n", st.sid, st.name, st.age);

	// 结构体类型数据赋值方式三:指针方式
	struct Student * pst;  // 定义了一个struct Student类型的指针
	pst = &st;
	pst->sid = 2001;   // pst->sid 等价于 (*pst).sid 等价于 st.sid
	pst->age = 23;
	strcpy_s(pst->name, "wangwu");
	printf("%d %s %d\n", st.sid, st.name, st.age);

	return 0;
}

结构体使用的注意事项

1. 结构体变量不可以加减乘除,但是可以相互赋值,但是最好传递结构体的地址以节省空间和时间(例如在下面的例子中用函数实现输出结构体时)

/*
时间:2020年6月2日10:54:56
内容:结构体变量和结构体指针变量作为函数传参
*/

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

struct Student  // 定义了一个新的数据类型叫 struct Student
{
	int sid;        // 成员1
	char name[200]; // 成员2
	int age;        // 成员3
};

void f(struct Student * pst) // 通过传递指针使得被调函数修改主调函数的结构体成员内容
{
	(*pst).age = 20;  // 修改了年龄
	pst->sid = 20003; // 修改了学号
}

void show1(struct Student st) // 传递结构体给形参,占用内存且耗费时间
{
	printf("%d %s %d\n", st.sid, st.name, st.age);
}

void show2(struct Student * pst) // 传递结构体指针给形参,32位的电脑,指针只占四个字节,省空间省时间
{
	printf("%d %s %d\n", pst->sid, pst->name, pst->age);
}

int main(void)
{
	struct Student st;
	st = { 19050060,"zyc",23 };
	show1(st);
	f(&st);
	show2(&st);
	return 0;
}

2. 结构体变量和结构体指针变量作为函数传参的问题

/*
时间:2020年6月2日10:38:13
内容:结构体变量和结构体指针变量作为函数传参
*/

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

struct Student  // 定义了一个新的数据类型叫 struct Student
{
	int sid;        // 成员1
	char name[200]; // 成员2
	int age;        // 成员3
};

void f(struct Student * pst)
{
	(*pst).age = 20;  // 修改了年龄
	pst->sid = 20003; // 修改了学号
}

int main(void)
{
	struct Student st;
	st = { 19050060,"zyc",23 };
	printf("%d %s %d\n", st.sid, st.name, st.age);
	f(&st);
	printf("%d %s %d\n", st.sid, st.name, st.age);
	return 0;
}