16.结构体

Posted traditional

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16.结构体相关的知识,希望对你有一定的参考价值。

//结构体
/*
	C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型
	它允许您存储不同类型的数据项。
	结构用于表示一条记录,假设要跟踪妹子的动态,可能需要跟踪每个妹子的下列属性:
	name
	age
	size
	length
*/
//定义结构
/*
	为了定义结构,必须使用以下语句,类型如下
	struct tag{
		member-list
		member-list 
		member-list  
		····
	}variable-list;
	tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量,举个栗子
	struct Girl
	{
		char name[20];
		int age;
		int size[3];
		int length;
	}
	在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:
		//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
		//同时又声明了结构体变量s1
		//这个结构体并没有标明其标签
		struct 
		{
			int a;
			char b;
			double c;
		} s1;
		 
		//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
		//结构体的标签被命名为SIMPLE,没有声明变量
		struct SIMPLE
		{
			int a;
			char b;
			double c;
		};
		//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
		struct SIMPLE t1, t2[20], *t3;
		 
		//也可以用typedef创建新类型
		typedef struct
		{
			int a;
			char b;
			double c; 
		} Simple2;
		//现在可以用Simple2作为类型声明新的结构体变量
		Simple2 u1, u2[20], *u3;
	在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。
	结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,
	而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
	此结构体的声明包含了其他的结构体
	struct COMPLEX
	{
		char string[100];
		struct SIMPLE a;
	};
	 
	//此结构体的声明包含了指向自己类型的指针
	struct NODE
	{
		char string[100];
		struct NODE *next_node;
	};
	
	如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:
	struct B;    //对结构体B进行不完整声明
 
	//结构体A中包含指向结构体B的指针
	struct A
	{
		struct B *partner;
		//other members;
	};
*/

//访问结构成员
/*
	为了访问结构的成员,我们使用成员访问运算符(.)
	成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
	可以使用 struct 关键字来定义结构类型的变量。举个栗子:
*/
#include <stdio.h>
#include <string.h>
struct Girl{
	char name[20];
	int age;
	char anime[30];
	int length;
};
int main01()
{
	struct Girl girl1;
	struct Girl girl2;
	//girl1
	strcpy(girl1.name, "matsuri");
	girl1.age = 400;
	strcpy(girl1.anime,"sola");
	girl1.length = 160;
	
	//girl2
	strcpy(girl2.name,"mashiro");
	girl2.age = 18;
	strcpy(girl2.anime, "樱花庄的宠物女孩");
	girl2.length = 161;
	
	//输出girl1信息
	printf("girl1 name = %s
", girl1.name);
	printf("girl1 age = %d
", girl1.age);
	printf("girl1 anime = %s
", girl1.anime);
	printf("girl1 length = %d
", girl1.length);
	
	//输出girl2信息
	printf("girl2 name = %s
", girl2.name);
	printf("girl2 age = %d
", girl2.age);
	printf("girl2 anime = %s
", girl2.anime);
	printf("girl2 length = %d
", girl2.length);
	/*
	girl1 name = matsuri
	girl1 age = 400
	girl1 anime = sola
	girl1 length = 160
	girl2 name = mashiro
	girl2 age = 18
	girl2 anime = 樱花庄的宠物女孩
	girl2 length = 161
	*/
}
	
//结构体作为函数参数
//可以把结构作为函数参数,传参方式与其他类型的变量或指针类似
void print_girl(struct Girl girl);
int main02()
{
	struct Girl girl3;
	strcpy(girl3.name, "satori");
	girl3.age = 18;
	strcpy(girl3.anime,"东方地灵殿");
	girl3.length = 155;
	print_girl(girl3);
}
void print_girl(struct Girl girl)
{
	printf("girl name = %s
", girl.name);
	printf("girl age = %d
", girl.age);
	printf("girl anime = %s
", girl.anime);
	printf("girl length = %d
", girl.length);
	/*
	girl name = satori
	girl age = 18
	girl anime = 东方地灵殿
	girl length = 155
	*/
}

//指向结构体的指针
/*
	可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
	struct Girl *struct_pointer;
	可以在上述定义的指针变量中存储结构变量的地址
	为了查找结构变量的地址,请把 & 运算符放在结构名称的前面
	struct_pointer = &girl1;
	为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符,如下所示:
	struct_pointer->title;
*/
//举个栗子:
void print_girl_info(struct Girl *girl);
int main03()
{
	struct Girl girl4;
	strcpy(girl4.name, "nagisa");
	girl4.age = 18;
	strcpy(girl4.anime,"clannad");
	girl4.length = 155;
	print_girl_info(&girl4);
}
void print_girl_info(struct Girl *girl)
{
	printf("girl name = %s
", girl -> name);
	printf("girl age = %d
", girl -> age);
	printf("girl anime = %s
", girl -> anime);
	printf("girl length = %d
", girl -> length);
	/*
		girl name = nagisa
		girl age = 18
		girl anime = clannad
		girl length = 155
	*/
}
	

  

以上是关于16.结构体的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

在C代码中将结构体变量作为参数传递效率忒低

Go 系列教程 —— 16. 结构体

C语言中如何将16位结构体定义为4位和12位两部分

Go 系列教程 —— 第 16 部分:结构体

Visual Studio2008 C++结构体成员需要内存对齐吗?