【C语言】8.结构体

结构体

1. 结构体类型的声明

  • 结构体的声明
struct tag
{
	member-list;
}variable-list;

1.1 结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

描述一个学生:

#include 
//描述—个学生:一些数据
//名字
//年龄
//电话
//性别
//	struct结构体关键字		stu-结构体标签		struct stu -结构体类型
struct Stu
{
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
};

int main()
{
	struct Stu s;

	return 0;
}

【C语言】8.结构体_第1张图片

不建议使用全局的结构体变量

//不建议使用全局的结构体变量
#include 
 
struct Stu
{
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}s1,s2,s3;//s1,s2,s3 是全局的结构体变量

int main()
{
	struct Stu s;//局部变量

	return 0;
}

typedef把结构体重新定一个名字

//typedef把结构体重新定一个名字,叫Stu,Stu是一个类型
#include 
typedef struct Stu
{
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;

int main()
{
	struct Stu s;//局部变量
	Stu s2;

	return 0;
}

注意

【C语言】8.结构体_第2张图片

结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

2. 结构体变量的定义和初始化

//初始化

typedef struct Stu
{
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;//声明类型的同时定义变量Stu

int main()
{
	Stu s1 = { "张三",20,"20201227","男" }; //初始化:定义变量的同时赋初值

	struct Stu s2 = { "茄子",30,"19191919","保密" };//初始化:定义变量的同时赋初值

	struct Stu s3; //定义结构体变量s3

	return 0;
}

嵌套结构体

//嵌套结构体

#include 

struct S
{
	int a;
	char c;
	char arr[20];
	double d;
};

struct T
{
	char ch[10];
	struct S s;
	char* pc;
};

int main()
{
	char arr[] = "hello World\n";
	struct T t = { "hehe",{100,'w',"hello ygh",3.14},arr };//结构体嵌套初始化
	printf("%s \n", t.ch); //hehe
	printf("%s\n", t.s.arr); //hello world
	printf("%1f\n", t.s.d);//3.14
	printf("%s \n", t.pc);//hello bit

	return 0;
}

3. 访问结构体

打印结构体内容

结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数

//打印结构体内容

//结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。
//点操作符接受两个操作数

#include 

struct stu
{
	char name[20];
	int age;
};

int main()
{
	struct stu s = { "zhangsan", 20 };
	printf("%s \n", s.name);
	printf("%d \n", s.age);

	return 0;
}

4. 结构体传参

4.1 问题:print1和 print2选哪个好?

#include 

struct Stu
{
	char name[20];
	int age;
	char tele[12];
	char sex[5];
};

/**
* 问题:print1和 print2选哪个好?
* 答案是︰首选print2函数。
* 
* 原因︰函数传参的时候,参数是需要压栈的。
*		如果传递一个结构体对象的时候,结构体过大,
*		参数压栈的的系统开销比较大,所以会导致性能的下降。
* 
* 结论∶结构体传参的时候,要传结构体的地址。
*/
void Print1(struct Stu tmp) {
	printf("name: %s\n", tmp.name);
	printf("age:%d\n", tmp.age);
	printf("tele: %s \n", tmp.tele);
	printf("sex:%s \n", tmp.sex);
}

void Print2(struct Stu* ps) {
	printf("name: %s\n", ps->name);
	printf("age:%d\n", ps->age);
	printf("tele: %s \n", ps->tele);
	printf("sex:%s \n", ps->sex);
}

int main()
{
	struct Stu s = { "李四",40,"233284780","男" };

	//打印结构体数据
	Print1(s);
	Print2(&s);

	return 0;
}

【C语言】8.结构体_第3张图片

4.2 什么是压栈?

【C语言】8.结构体_第4张图片

【C语言】8.结构体_第5张图片

  • 数据结构:
    • 线性数据结构
    • 顺序表
    • 链表
    • 队列
    • 树形数据结构
    • 二叉树

5. 练习题

1

struct student
{
	int num ;
    char name [32];
	float score;
}stu;

则下面的叙述不正确的是:( D )

A. struct是结构体类型的关键字

B. struct student 是用户定义的结构体类型

C. num,score都是结构体成员名

D. stu 是用户定义的结构体类型名

2

题目名称;

下面程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是( B )

题目名称:

下面程序要求输出结构体中成员a的数据, 以下不能填入横线处的内容是(B)

题目内容:

​ A. a.a

​ B. *p.a

​ C. p->a.

​ D. (*p).a

#include 

struct stu
{
	int num;
	char name[10];
	int age;
};

void fun(struct stu* p)
{
	printf("%s\n", (*p).name);
	return;
}

int main()
{
	struct stu students[3] = {
		{9801,"zhang",20},
		{9802,"wang",19},
		{9803,"zhao",18}
	};
	fun(students + 1);

	return 0;
}

【C语言】8.结构体_第6张图片

应该用括号括起来(*p).a,优先级问题

不加括号就会变成*(p.a)

【C语言】8.结构体_第7张图片

3

下面程序的输出结果是:©

​ A.zhang

​ B.zhao

​ C.wang

​ D.18

#include 

struct stu
{
	int num;
	char name[10];
	int age;
};

void fun(struct stu* p)
{
	printf("%s\n", (*p).name);
	return;
}

int main()
{
	struct stu students[3] = {
		{9801,"zhang",20},
		{9802,"wang",19},
		{9803,"zhao",18}
	};
	fun(students + 1);	//wang

	return 0;
}

4

结构体访问成员的操作符不包含:( D )

题目内容:

A. .操作符

B. ->操作符

C. *解引用操作符

D. sizeof

5

题目名称:喝汽水问题

题目内容:

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。

#include 

int main()
{
	int money = 0;
	int total = 0;
	int empty = 0;
	scanf_s("%d", &money);

	//买回来的汽水喝掉
	total = money;
	empty = money;

	//换回来的汽水
	while (empty >= 2)
	{
		total += empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("total = %d\n", total);

	return 0;
}


//另一种方法
#include 

int main()
{
	int money = 0;
	int total = 0;
	int empty = 0;
	scanf_s("%d", &money);
	
	//买回来的汽水喝掉
	if (money == 0)
	{
		total = 0;
	}
	else
	{
		total = 2 * money - 1;
	}
	printf("total = %d\n", total);

	return 0;
}

【C语言】8.结构体_第8张图片

GitHub代码

你可能感兴趣的:(C语言学习笔记,c语言)