嵌入式C语言编程(嵌入式开发使用的c语言与汇编语言对比)

本文主要是C基础编程关于结构的初步讲解,会进一步讲解C高级相关概念(C神可以先跳过)。近期会陆续上传IT编程相关的资料和视频教程,可以互相关注,互相交流:C C Java python linux ARM嵌入式物联网等。想学编程的朋友可以去首页看看相关教程和资料。
这篇文章的主要内容是:
1定义结构的一般形式
2结构类型变量的描述
3结构可变成员的表示
4结构变量的赋值
5结构变量的初始化
6结构数组的定义
7结构指针变量的描述和使用
7.1指向结构变量的指针
7.2指向结构数组的指针
7.3结构指针变量作为函数参数
8类型定义器typedef
9本章概述
11.1定义结构的一般形式
在实际问题中,一组数据往往有不同的数据类型。例如,在学生登记表中,姓名应该是字符型;学号可以是整数或字符类型;年龄应为整数;性别应为字符型;分数可以是整数也可以是实数。显然你不能用数组来存储这组数据。因为数组中所有元素的类型和长度必须一致,所以编译器系统很容易处理它们。为了解决这个问题,在C语言中给出了另一种构造数据类型3354‘结构’或‘结构’。它相当于其他高级语言中的记录。“结构”是一种构造,由几个“构件”组成。每个成员都可以是基本数据类型或构造类型。结构是一种“构造”的数据类型,所以在被解释和使用之前,必须先定义它,也就是构造。就像在解释和调用一个函数之前定义它一样。
定义结构的一般形式是:
结构名称
{
成员列表
};
成员列表由几个成员组成,每个成员都是结构的一部分。每个成员还必须做一个类描述,形式为:
类型说明符成员名称;
成员的命名应该符合标识符的书写规则。示例:结构图
{
int num
char name[20];迷人的性爱;浮动分数;
};
在这个结构定义中,该结构被命名为stu,它由四个成员组成。第一个成员是num,一个整数变量;第二个成员是name,一个字符数组;第三个成员是性别,一个性格变量;第四个成员是score,一个实变量。注意,括号后面的分号是必不可少的。定义了结构之后,就可以解释变量了。所有被描述为结构stu的变量都由上述四个成员组成。因此,该结构是一个复杂的数据类型,是一组具有固定数量和不同类型的有序变量。
11.2结构类型变量的描述
有三种方法可以解释结构变量。以上面定义的stu为例来说明。先定义结构,再解释结构变量。
比如struct stu
{
int num
char name[20];迷人的性爱;浮动分数;
};
struct stu boy1,boy2
两个变量boy1和boy2是stu结构类型。你也可以使用宏定义来创建一个符号常量来表示一个结构类型。
例如:
定义STU结构stu STU
{
int num
char name[20];迷人的性爱;浮动分数;
};
斯图男孩1,男孩2;
在定义结构类型时解释结构变量。例如:
结构研究
{
int num
char name[20];迷人的性爱;浮动分数;
}boy1,boy2
这种解释形式的一般形式是:
结构名称
{
成员列表
}变量名表列;
直接解释结构变量。例如:
结构体
{
int num
char name[20];迷人的性爱;浮动分数;
}boy1,boy2
这种解释的一般形式是:struct
{
成员列表
}变量名表列;
第三种方法和第二种方法的区别在于,第三种方法省略了结构名,直接给出了结构变量。三种方法中描述的boy1和boy2变量的结构如下图所示。
在解释了boy1和boy2变量是stu类型之后,这两个变量的每个成员都可以被赋值。在上面stu结构的定义中,所有成员都是基本数据类型或者数组类型。
成员也可以是结构,即嵌套结构。例如,下图显示了另一种数据结构。
根据该图,可以给出以下结构定义:
结构日期
{
int月;int日;int年;
};
结构{
int num
char name[20];迷人的性爱;
结构日期生日;浮动分数;
}boy1,boy2
首先定义一个结构日期,它由三个成员组成:月(month)、日(day)和年(year)。当定义和描述变量boy1和boy2时,它们的成员生日被描述为数据结构类型。成员名可以与程序中的其他变量同名,而不会互相干扰。
11.3结构可变构件的表示
当程序中使用结构变量时,它们通常不是作为一个整体使用的。在ANSI C中,除了允许同类型的结构变量相互赋值之外,结构变量的使用,包括赋值、输入、输出、运算等。一般是由结构变量的成员来实现的。
结构变量成员的一般形式是:结构变量名。成员名称。
例如:
Boy1.num是第一个人的学号。
男孩2:性是第二个人的性。
如果成员本身是一个结构,那么必须一步一步地找到最低级别的成员才能使用。例如:
男孩1 .生日.月份
即第一个人出生的月份的成员可以在程序中单独使用,和普通变量完全一样。
1.4结构变量的赋值
结构变量的赋值就是给成员赋值。它可以通过输入语句或赋值语句来完成。
【例11.1】给结构变量赋值,输出它们的值。
在这个程序中,赋值语句用来给两个成员赋值,num和name,name是一个字符串指针变量。使用scanf函数动态输入性别和分数成员的值,然后整体给出boy1到boy2所有成员的值。最后分别输出boy2的每个成员值。这个例子展示了结构变量的赋值、输入和输出的方法。
1.5结构变量的初始化
像其他类型的变量一样,结构变量在定义时可以被初始化和赋值。
【例11.2】初始化结构变量。
在这个例子中,boy2和boy1被定义为外部结构变量,boy1被初始化和赋值。在main函数中,将boy1的整数值赋予boy2,然后使用两个printf语句输出boy2的每个成员的值。
1.6结构数组的定义
数组的元素也可以是结构类型的。因此,可以形成结构化阵列。结构的每个元素都是一个下标结构变量,具有相同的结构类型。在实际应用中,经常使用结构数组来表示一个具有相同数据结构的组。例如某个班级的学生档案、某个车间工人的工资单等。
方法类似于结构变量,只需声明它是数组类型。例如:
结构研究
{
int numchar * name迷人的性爱;浮动分数;
}男孩[5];
定义了一个结构数组boy,它有五个元素,boy [0] ~ boy [4]。每个数组元素都具有struct stu的结构形式。结构数组可以被初始化和赋值。
例如:
当所有元素都被初始化时,数组长度可能没有给定。
【例11.3】计算学生平均分和不及格人数。
在这个示例程序中,定义了一个外部结构数组boy,共有5个元素,并进行了初始化赋值。在main函数中,使用for语句将每个元素的score成员值逐个累加,存储在s中,如果score值小于60(失败),即计数器C加1。循环完成后,计算平均分,输出全班学生的总分、平均分和不及格人数。
[例11.4]建立同学通讯录
在这个程序中定义了一个结构mem,它有两个成员,name和phone,用来表示姓名和电话号码。Man在main函数中被定义为mem类型的结构数组。在for语句中,使用gets函数输入每个元素中两个成员的值。然后,在for语句中,使用printf语句输出每个元素中两个成员的值。
1.7结构指针变量的描述和使用11.7.1指向结构变量的指针
当一个指针变量被用来指向一个结构变量时,它被称为结构指针变量。结构指针变量中的值是所指向的结构变量的第一个地址。结构变量可以通过结构指针访问,这与数组指针和函数指针的情况相同。
结构指针变量描述的一般形式是:
结构结构名*结构点
例如,在前面的示例中,定义了结构stu。为了解释一个指向stu的指针变量Pstu,可以写成:
struct stu * pstu
当然,在定义stu结构时也可以解释Pstu。像前面讨论的各种指针变量一样,结构指针变量在使用之前必须赋值。
赋值是将结构变量的第一个地址赋给指针变量,而不是结构名。如果boy是一个描述为stu类型的结构变量,那么:
Pstu=boy正确,而:Pstu=stu
是错误的。
名字和结构变量是两个不同的概念,不能混淆。一个结构名只能代表一种结构形式,编译系统不为其分配内存空间。只有当一个变量被描述为这种类型的结构时,该变量才会被分配存储空间。所以上面的stu写法是错误的,不可能得到一个结构名的首地址。有了结构指针变量,访问结构变量的每个成员就更容易了。
其访问的一般形式是:
(*结构指针变量)。成员名称可以是:
指针变量-成员名称
例如:
(*pstu)。编号或:
pstu-编号
需要注意的是(*pstu)两边的括号是必不可少的,因为成员字符“.”优先于“*”。如果去掉括号,写成*pstu.num,就相当于*(pstu.num)。这样,意思就完全错了。下面的例子用来说明结构指针变量的具体解释和用法。
[示例11.5]
这个示例程序定义了一个结构stu,定义了stu类型结构变量boy1并进行初始化赋值,还定义了一个指向stu类型结构的指针变量pstu。在main函数中,pstu被赋予了boy1的地址,所以pstu指向boy1。然后boy1的成员值在printf语句中以三种形式输出。从运行结果可以看出:
结构变量。成员名称
(*结构指针变量)。成员名称结构指针变量-成员名称
用来表示结构成员的三种形式是完全等价的。
指向结构数组的指针
指针可以指向一个结构体数组,结构体指针变量的值是整个结构体数组的第一个地址。结构指针变量也可以指向结构数组的元素,在这种情况下,结构指针变量的值是结构数组元素的第一个地址。如果ps设置为指向结构数组的指针变量,那么ps也指向结构数组的元素0,ps 1指向元素1。
Ps指向I元素。这与普通数组的情况一致。
[例11.6]用指针变量输出结构数组。
程序中定义并初始化了stu结构类型的外部数组boy。在主函数中将ps定义为指向stu类型的指针。在for的loop语句的表达式1中,ps被赋予boy的第一个地址,然后循环。
5次,输出男孩数组中每个成员的值。
应该注意,虽然结构指针变量可以用来访问结构变量或结构数组元素的成员,但它不能指向成员。也就是说,不允许拿会员的地址去给。因此,下面的赋值是错误的。
ps=boy[1]。性;它只能是:
ps=男生;(给出数组的第一个地址)或:
PS=boy[0];(将第一个地址赋予元素0)
11.7.3结构指针变量作为函数参数
在ANSI C标准中,允许将结构变量用作整体传输的函数参数。但这种转移需要逐个转移所有成员,尤其是成员为数组时,会耗费大量的时间和空间,严重降低程序的效率。所以最好的办法就是用指针,也就是用指针变量作为函数参数来传递。此时从实参到形参只传递地址,减少了时间和空间的开销。
【例11.7】计算一组学生的平均分和不及格人数。用结构指针变量作为函数参数编程。
这个程序中定义了函数ave,它的参数是结构指针变量ps。Boy定义为外部结构的数组,所以在整个源程序中都有效。在main函数中定义了结构指针变量ps,将boy的第一个地址赋给它,使ps指向boy数组。然后以ps为参数调用函数ave。在函数ave中,计算平均分并统计不及格学生数,输出结果。
因为这个程序使用指针变量进行操作和处理,所以速度更快,效率更高。
1.8类型定义器typedef
c语言不仅提供了丰富的数据类型,还允许用户定义自己的类型描述符,也就是说,允许用户为数据类型取‘别名’。类型定义器typedef可以用来完成这个功能。例如,有整数量a、b,解释如下:
int a,b;
其中int是整数变量的类型描述符。int的完整写法是整数。为了增加程序的可读性,整数说明符可以定义为:
typedef int整数
以后可以用INTEGER代替int作为整型变量的类型描述。例如:
整数a,b;
它相当于:
int a,b;
用typedef定义数组、指针、结构等类型,会带来很大的方便,不仅让程序编写简单还让意思更清晰,从而增强可读性。
例如:
typedef字符名称[20];NAME是一个字符数组类型,数组长度为20。然后你可以用名字来描述变量,比如:
名称a1、a2、s1、S2;
完全等同于:
字符a1[20],a2[20],s1[20],s2[20]
另一个例子是:
typedef结构stu
{
char name[20];
int age迷人的性爱;
}斯图;
定义stu来表示STU的结构类型,然后用STU来解释结构变量:STU body1,body2
typedef定义的一般形式是:
Typedef原始类型名新类型名
其中,原类型名包含定义部分,新类型名一般用大写表示,便于区分。
有时候typedef的功能可以用宏定义来代替,但是宏定义是通过预处理来完成的,而typedef是在编译时完成的,更加灵活方便。
1.9本章概述1。“结构”是一种结构,由几个“成员”组成。
2.结构变量成员的一般形式有:结构变量名和成员名;结构变量可以在定义时初始化和赋值。
3.数组的元素也可以是结构类型,每个元素都是具有相同结构类型的下标结构变量。
4.结构指针变量描述的一般形式是:struct结构名*结构指针变量名;一般的访问形式是:结构指针变量-成员名。
5.使用结构变量作为函数参数最好的方法是使用指针,也就是使用指针变量作为函数参数进行传输。

影音素材

恐龙特急克塞号 恐竜戦隊コセイドン(1978)百度网盘高清完整版下载

2023-9-3 7:05:23

小学素材

摩比课堂一年级计算思维提高班(完结)(高清视频)百度网盘课程资料完整版下载

2023-7-24 22:40:23

购物车
优惠劵
搜索