请回答c语言-结构体【入门】


思维导图

1. 结构体的声明

1.1 结构的基础知识

生活中我们见到的对象都是复杂的对象,比如说描述一只猫或是一本书,不肯能用简单的型或是浮点型来描述这些类型

1.2 结构的声明

struct tag
{
member-list;
}variable-list;

假如说我要描述一个pokemon

我需要从多种特性来描述,比如名字,图鉴编号,身高或是体重

第一种创建方式
struct Pokemon
{
	char name[20];//名字
	int id;//图鉴编号
	float height; //身高
	float weight;//重量
	char fighting_type[20]; //属性
	char species[15]; //类型
};
int main()
{
	struct Pokemon pikachu;//拿这个结构体来创建一个变量,变量类型是这个结构体Pokemon
    return 0;
}
第二种创建方式
struct Pokemon
{
	char name[20];//名字
	int id;//图鉴编号
	float height; //身高
	float weight;//重量
	char fighting_type[20]; //属性
	char species[15]; //类型
}pokemon1,pokemon2;//全局

这两种创建方式的区别是第二种创建方式创建的结构体变量是全局

1.3 结构成员的类型

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

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

和数组一样,结构体也要初始化,按照之前定义的顺序和类型定义

struct Pokemon pikachu = { "Pikachu",25,0.4,6.0,"electric","mouse pokemon" };

2. 结构体成员的访问

之前都已经写过,就不细写了

  • 结构体变量访问成员

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

struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员

或是输出

printf("name = %s id = %d height = %.1f weight = %.1f\n", pikachu.name, pikachu.id, pikachu.height, pikachu.weight);

image-20211119102925643

  • 结构体指针访问指向变量的成员

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针(->)。

struct Pokemon* ps = &pikachu;//结构体指针
	printf("name = %s id = %d height = %.1f weight = %.1f\n", ps->name, ps->id, ps->height, ps->weight);
	printf("name = %s id = %d height = %.1f weight = %.1f\n", (*ps).name, (*ps).id, (*ps).height, (*ps).weight);

3. 结构体传参

在我们需要传参来打印数组的时候,我们选择那一种Print函数会好一点呢

struct S
{
	int arr[1000];
	float f;
	char ch[100];
};

void print1(struct S tmp)
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", tmp.arr[i]);
	}
	printf("\n");
	printf("%f\n", tmp.f);
	printf("%s\n", tmp.ch);
}

void print2(struct S* ps)
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
	printf("%f\n", ps->f);
	printf("%s\n", ps->ch);
}
int main()
{
	struct S s = { {1,2,3,4,5,6,7,8,9,10}, 5.5f, "Hello there" };
	print1(s);
	print2(&s); 
	return 0;
}

print1是一个值传参,所以会创造一种临时拷贝,但是再次重新创造一个空间的话,就会造成空间的浪费,倘若结构体里面所含的内容足够大的话,那么将导致问题出现

image-20211119110724396

print2就是传地址,所以是不用创建一整个结构体,只是创造一个指针,当结构体足够大的时候,节省空间的效率就会非常高。

下面是比较专业的解释:

  • 函数传参的时候,参数是需要压栈的。
    如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

当程序运行的时候,函数的栈的过程是

比如执行这样一段代码

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

程序执行的过程是按照主函数的代码顺序在栈中从下到上,从先到后的创建
image-20211119111552309

小结:

一般我们在传参结构体的时候采用传地址的话是一个较好的选择

总结

老铁们有收获的话一定要给个赞,多多评论哦

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: C语言基础知识入门PDF是一份C语言的教学材料,适合初学者学习和掌握C语言的基本语法、语义和编程方法。 C语言是一种高效、灵活、可移植、可扩展的编程语言,被广泛应用于操作系统、数据库系统、嵌入式系统等领域。学习C语言,需要掌握计算机基本原理、编程思想和算法设计等知识,而C语言基础知识入门PDF提供了一种快速入门、易于理解的学习途径。 C语言基础知识入门PDF包括了C语言的基本数据类型、运算符、流程控制语句、函数、指针、数组、结构体等内容,通过实例演示和练习题目的方式,帮助学生深入理解C语言的编程思想和技巧。 此外,C语言基础知识入门PDF还介绍了一些常用的C语言开发工具,如编辑器、编译器和调试器等,帮助学习者掌握基本的开发环境和技巧。 总之,C语言基础知识入门PDF是一本很好的C语言入门教材,通过细致详尽的篇章结构、浅显易懂的代码示范和解释,对于初学者学习C语言或复习C语言基础知识来说,都是一份很好的参考资料。 ### 回答2: 《C语言基础知识入门》是一本适合初学者入门C语言教材,它由浅入深地介绍了C语言的基本语法、数据类型、控制结构、函数以及指针等内容。这本教材所包含的知识点非常基础和易懂,对于初学者来说非常友好,能够循序渐进地帮助他们逐步掌握C语言的基本概念和基础知识。 在学习过程中,这本教材还特别注重实践,提供了大量的实例代码以及习题和答案,帮助学生巩固所学知识,培养编程思维,提高编程能力。此外,这本教材还介绍了一些C语言的衍生语言和标准库,让学生在了解基础知识的同时,对C语言的发展和应用方向也有所了解。 总之,对于初学者来说,《C语言基础知识入门》是一本非常好的入门教材,它简单易懂、注重实践、知识面广泛、涵盖了C语言的基本知识点和实际应用场景,推荐给所有对于C语言感兴趣的初学者。 ### 回答3: 《C语言基础知识入门PDF》是一本适合初学者的C语言教程,它详细介绍了C语言的各个方面。该教程涵盖了C语言的基本语法、数据类型、运算符、流程控制、函数、指针、结构体、文件操作等重要内容。通过学习这本教程,初学者可以逐步掌握C语言的基础知识,轻松理解编程思路。 该教程首先讲解了C语言的数据类型,包括整型、浮点型、字符型等,以及变量的定义和命名方法。接着介绍了运算符的使用方法,包括算术运算符、关系运算符和逻辑运算符。 在掌握了基础语法之后,该教程讲解了流程控制语句,如if语句、switch语句和循环语句等。这些语句非常重要,可以让程序根据不同的情况执行不同的操作。 接着,该教程介绍了函数的定义和调用方法。函数可以让程序模块化,使代码更具可读性。同时,它还讲解了指针的概念和使用方法,指针可以让程序更加灵活。 最后,该教程讲解了文件操作。文件是计算机存储数据的重要方式,学会文件操作可以让程序更好地处理数据。 总的来说,《C语言基础知识入门PDF》适合没有任何编程基础的初学者阅读。通过阅读该教程,初学者可以了解C语言的基本语法和编程思想,为以后深入学习打下基础。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

言之命至9012

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

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

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

打赏作者

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

抵扣说明:

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

余额充值