📄 c51结构、联合和枚举的使用.htm
字号:
}
}
function copyurl(url)
{
try{
clipboardData.setData('Text',url);
showAlert('已经把该社团网址复制到系统剪贴板,您可以使用(Ctrl+V或鼠标右键)粘贴功能,通过其他软件记录或发送给您的朋友。')
}
catch(e){}
}
function add_favorite(uid, url, name)
{
window.open("/personal/favorite/add.php?member_id="+uid+"&url="+url+"&name="+name,'_blank','width=400,height=220,toolbar=0,locationbar=0,menubar=0,statbar=0');
return false;
}
// 提示登录
function alertlert_login()
{
showAlert('对不起,您目前没有权限,请先登录!');
document.login_form1.account.focus();
}
//申请加入社团
function con_join(con_gid)
{
showConfirm("您确认加入本社团吗?","window.location.href='/league/apply.php?g_id="+con_gid+"';","");
}
//退出本社团
function con_quiet(con_gid,con_uid)
{
showConfirm("您确认退出本社团吗?","window.location.href='/league/member/quiet_member.php?g_id="+con_gid+"&q_uid="+con_uid+"';","");
}
</SCRIPT>
<!-- 回复框 -->
<DIV id=background style="DISPLAY: none"></DIV>
<DIV id=postbox
style="DISPLAY: none; Z-INDEX: 50; LEFT: 769px; WIDTH: 600px; POSITION: absolute; TOP: 271px">
<FORM name=reply_comment action=/league/comment/index.php?gid=514465 method=post
target=hidden_frame><INPUT id=act type=hidden value=add name=act> <INPUT id=r_id
type=hidden name=r_id> <INPUT id=t_id type=hidden name=t_id> <INPUT id=f_uid
type=hidden name=f_uid>
<TABLE cellSpacing=0 cellPadding=0 width="70%" border=0>
<TBODY>
<TR>
<TD height=13> </TD></TR>
<TR>
<TD class=box_common height=26> <SPAN
class=font_common_title>回复评论</SPAN></TD></TR></TBODY></TABLE>
<TABLE class=box_common01 cellSpacing=0 cellPadding=0 width="70%">
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=8 cellPadding=0 width="100%" bgColor=#ffffff
border=0><TBODY>
<TR>
<TD class=font_common vAlign=top align=right height=63>内容:</TD>
<TD class=font_common vAlign=top><TEXTAREA class=input_box01 id=input_area name=input_area rows=6 cols=48></TEXTAREA></TD></TR>
<TR>
<TD class=font_common vAlign=top align=right width="15%">原文:</TD>
<TD class=font_common style="LINE-HEIGHT: 18px" vAlign=top
width="85%"><SPAN class=gray id=past_type></SPAN></TD></TR>
<TR>
<TD class=font_common vAlign=top align=middle colSpan=2><INPUT class=btn01 onclick=javascript:hidden_reply();submit_post(document.reply_comment); type=button value=发表 name=queding>
<INPUT class=btn01 onclick=hidden_reply(); type=reset value=取消>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></FORM></DIV><!-- 回复框 -->
<DIV id=mainBox>
<DIV id=mainBoxBg>
<TABLE class=module_title cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=corner_left></TD>
<TD class=corner_center><A
href="http://www.5jia1.com/league/?gid=514465">首页</A> > <A
href="http://www.5jia1.com/league/blog/blog_index.php?gid=514465">社团文集</A> > <A
href="http://www.5jia1.com/league/blog/show_comm.php?bid=361549">第十七课
C51结构、联合和枚举的使用</A></TD>
<TD class=corner_right></TD></TR></TBODY></TABLE>
<DIV class=module_content>
<DIV class=module_content_line>
<DIV class=bg>
<TABLE cellSpacing=10 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE class=box_common cellSpacing=1 cellPadding=5 width="100%"
border=0><TBODY>
<TR class=box_common_title>
<TD colSpan=2>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="35%"><B>第十七课 C51结构、联合和枚举的使用</B></TD>
<TD align=right width="65%">作者: <A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank>张文俊</A> 2007-08-15
09:18:14 </TD></TR></TBODY></TABLE></TD></TR>
<TR class=box_content>
<TD vAlign=top align=middle width="10%"><A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank><IMG class=box01 height=98
src="17.files/s_0_personal_photo_505887.jpg" width=98 vspace=5
border=0></A><BR><IMG height=14 src="17.files/icon_boy.gif" width=14
border=0> <A
href="http://www.5jia1.com/personal/?member_id=505887"
target=_blank>张文俊</A> </TD>
<TD>
<TABLE class="font_content autowrap" cellSpacing=12 cellPadding=0
width="100%" border=0>
<TBODY>
<TR>
<TD class=line_h20 style="WIDTH: 790px">
<DIV style="OVERFLOW-X: auto; WIDTH: 100%">
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TH vAlign=center align=middle height=32>
<H1>第十七课 C51结构、联合和枚举的使用</H1></TH></TR>
<TR>
<TD align=middle bgColor=#f7f7f7
height=25>作者:佚名 来源:本站原创 点击数:
113 更新时间:2007年07月12日 </TD></TR>
<TR>
<TD align=middle> </TD></TR></TBODY></TABLE>
<P>前面的文章中介绍了 C 语言的基本数据类型,为了更有效的处理更复杂的数据,C 语
言引入了构造类型的数据类型。构造类型就是将一批各种类型的数据放在一起形成一种特殊
类型的数据。之前讨论过的数组也算是一种构造类型的数据,单片机c语言 中的构造类型还有结构、 枚举和联合。</P>
<P>结构</P>
<P>结构是一种数据的集合体,它能按需要将不一样类型的变量组合在一起,整个集合体用
一个结构变量名表示,组成这个集合体的各个变量称为结构成员。理解结构的概念,能用
班级和学生的关系去理解。班级名称就相当于结构变量名,它代表所有同学的集合,而每个
同学就是这个结构中的成员。使用结构变量时,要先定义结构类型。一般定义格式如下:</P>
<P>struct 结构名 {结构元素表};</P>
<P>例子:struct FileInfo</P>
<P>{</P>
<P>unsigned char FileName[4]; unsigned long Date; unsigned int
Size;</P>
<P>}</P>
<P>上面的例子中定义了一个简单的文件信息结构类型,它可用于定义用于简单的<A
href="http://www.51hei.com/" target=_blank><U><FONT
color=#800080>单片机</FONT></U></A>文
件信息,结构中有三个元素,分别用于操作文件名、日期、大小。因为结构中的每个数据成
员能使用不一样的数据类型,所以要对每个数据成员进行数据类型定义。定义好一个结构类
型后,能按下面的格式进行定义结构变量,要注意的是只有结构变量才能参与程序的执
行,结构类型只是用于说明结构变量是属于那一种结构。</P>
<P>struct 结构名 结构变量名 1,结构变量名 2……结构变量 N; 例子:struct
FileInfo NewFileInfo, OleFileInfo;</P>
<P>通过上面的定义 NewFileInfo 和 OleFileInfo 都是 FileInfo 结构,都具有一个字符型数组
一个长整型和一个整形数据。定义结构类型只是给出了这个结构的组织形式,它不会占用存
储空间,也就说结构名是不能进行赋值和运算等操作的。结构变量则是结构中的具体成员, 会占用空间,能对每个成员进行操作。</P>
<P>结构是允许嵌套的,也就是说在定义结构类型时,结构的元素能由另一个结构构成。 如:</P>
<P>struct clock</P>
<P>{</P>
<P>unsigned char sec, min, hour;</P>
<P>}</P>
<P>struct date</P>
<P>{</P>
<P>unsigned int year;</P>
<P>unsigned char month, day;</P>
<P>struct clock Time; //这是结构嵌套</P>
<P>}</P>
<P>struct date NowDate; //定义 data 结构变量名为 NowDate</P>
<P><BR style="PAGE-BREAK-BEFORE: auto" clear=all> </P>
<DIV class=Section75>
<P>开始学习的朋友看到这可能会发问:“各个数据元素要如何引用、赋值呢?”使用结构变量
时是通过对它的结构元素的引用来实现的。引用的方法是使用存取结构元素成员运算符“.” 来连接结构名和元素名,格式如下:</P>
<P>结构变量名.结构元素</P>
<P>要存取上例结构变量中的月份时,就要写成 NowDate..year。而嵌套的结构,在引用元
素时就要使用多个成员运算符,一级一级连接到最低级的结构元素。要注意的是在 单片机c语言 中
只能对最低级的结构元素进行访问,而不可能对整个结构进行操作。操作例子:</P>
<P>NowDate.year = 2005;</P>
<P>NowDate.month = OleMonth+ 2; //月份数据在旧的基础上加 2</P>
<P>NowDate.Time.min++; //分针加 1,嵌套时只能引用最低一级元素
一个结构变量中元素的名字能和程序中其他地方使用的变量同名,因为元素是属于它所在 的结构中,使用时要用成员运算符指定。</P>
<P>结构类型的定义还能有如下的两种格式。</P>
<P>struct</P>
<P>{</P>
<P>结构元素表</P>
<P>} 结构变量名 1,结构变量名 2……结构变量名 N;</P>
<P>例:struct</P>
<P>{</P>
<P>unsigned char FileName[4]; unsigned long Date; unsigned int
Size;</P>
<P>} NewFileInfo, OleFileInfo;</P>
<P>这一种定义方式定义没有使用结构名,称为无名结构。通常会用于程序中只有几个确定
的结构变量的场合,不能在其它结构中嵌套。</P>
<P>另一种定义方式如下:</P>
<P>struct 结构名</P>
<P>{</P>
<P>结构元素表</P>
<P>} 结构变量名 1,结构变量名 2……结构变量名 N;</P>
<P>例:struct FileInfo</P>
<P>{</P>
<P>unsigned char FileName[4]; unsigned long Date; unsigned int
Size;</P>
<P>} NewFileInfo, OleFileInfo;</P>
<P>使用结构名能便于阅读程序和便于以后要在定义其它结构中使用。 枚举</P>
<P>在程序中经常要用到一些变量去做程序中的判断标志。如经常要用一个字符或整型变量</P>
<P>去储存 1 和 0 做判断条件真假的标志,但我们也许会疏忽这个变量只有当等于 0 或 1 才是有</P></DIV>
<P><BR style="PAGE-BREAK-BEFORE: auto" clear=all> </P>
<DIV class=Section76>
<P>效的,而将它赋上别的值,而使程序出错或变的混乱。这个时候能使用枚举数据类型去定义变
量,限制错误赋值。枚举数据类型就是把某些整型常量的集合用一个名字表示,其中的整型
常量就是这种枚举类型变量的可取的合法值。枚举类型的二种定义格式如下:</P>
<P>enum 枚举名 {枚举值列表} 变量列表;</P>
<P>例 enum TFFlag {False, True} TFF;</P>
<P>enum 枚举名 {枚举值列表};</P>
<P>emum 枚举名 变量列表;</P>
<P>例 enum Week {Sun, Mon, Tue, Wed, Thu,
Fri, Sat};</P>
<P>enum Week OldWeek, NewWeek;</P>
<P>看了上面的例子,你也许有一个地方想不通,那就是为什么枚举值不用贬值就能使
用?那是因为在枚举列表中,每一项名称代表一个整数值,在默认的情况下,编译器会自动 为每一项赋值,第一项赋值为 0,第二项为
1…...如 Week 中的 Sun 为 0,Fri 为 5。C 语言也
允许对各项值做初始化赋值,要注意的是在对某项值初始化后,它的后续的各项值也随之递 增。如:</P>
<P>enum Week {Mon=1, Tue, Wed, Thu, Fri, Sat, Sun};</P>
<P>上例的枚举就使 Week 值从 1 到 7,这样会更符合我们的习惯。使用枚举就如变量一样,
但在程序中不能为其赋值。</P>
<P>联合</P>
<P>联合同样是 C 语言中的构造类型的数据结构。它和结构类型一样能包含不一样类型的
数据元素,所不一样的是联合的数据元素都是从同一个数据地址开始存放。结构变量占用的内
存大小是该结构中数据元素所占内存数的总和,而联合变量所占用内存大小只是该联合中最
长的元素所占用的内存大小。如在结构中定义了一个 int 和一个 char,那么结构变量就会占</P>
<P>用 3 个字节的内存,而在联合中同样定义一个 int 和一个 char,联合变量只会占用 2 个字节。
这种能充分利用内存空间的技术叫‘内存覆盖技术’,它能使不一样的变量分时的使用同一
个内存空间。使用联合变量时要注意它的数据元素只能是分时使用,而不能同时使用。举个 简单的例子,程序先为联合中的 int 赋值
1000,后来又为 char 赋值 10,那么这个时候就不能引用</P>
<P>int 了,不然程序会出错,起作用的是最后一次赋值的元素,而上一次赋值的元素就失效了。
使用中还要注意定义联合变量时不能对它的值初始化、能使用指向联合变量的指针对其操
作、联合变量不能作为函数的参数进行传递,数组和结构能出现在联合中。</P>
<P>联合类型变量的定义方法和结构的定义方法差不多,只要把关键字 struct 换用 union 就
能了。联合变量的引用方法除也是使用‘.’成员运算符。</P>
<P>下面就用一个综合的例子说明三种类型的简单使用。</P>
<P>#include <AT89X51.H></P>
<P>#include <stdio.h></P>
<P>void main(void)</P>
<P>{</P>
<P>enum TF {</P>
<P>False, True} State; //定义一个枚举,使程序更易读</P>
<P>union File { //联合中包含一数组和结构,</P></DIV>
<P><BR style="PAGE-BREAK-BEFORE: auto" clear=all> </P>
<DIV class=Section77>
<P>unsigned char Str[11]; //整个联合共用 11 个字节内存</P>
<P>struct FN {</P>
<P>unsigned char Name[6],EName[5];} FileName;</P>
<P>} MyFile;</P>
<P>unsigned char Temp;</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -