C语言复习之结构体基础知识

发布者:温馨生活最新更新时间:2018-11-22 来源: eefocus关键字:C语言  结构体  基础知识 手机看文章 扫描二维码
随时随地手机看文章

 一.基础知识


1.聚合数据类型(aggregate data type)能够同时存储超过一个的单独数据。C提供了两种类型的聚合数据类型,数组和结构。


(1)数组是相同类型的元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。


(2)结构也是一些值的集合,这些值称为它的成员(member),但一个结构的各个成员可能具有不同的类型。


2.数组元素可以通过下标访问,这只是因为数组的元素长度相同。


3.由于一个结构的成员可能长度不同,所以不能使用小标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字访问的。


4.结构并不是一个它自身成员的数组。和数组名不同,当一个结构变量在表达式中使用时,它并不被置换成一个指针。结构变量也无法使用下标来选择特定的成员。


5.结构变量属于标量类型,结构也可以作为传递给函数的参数,它们也可以作为返回值从函数返回,相同类型的结构变量相互之间可以赋值。


6.可以声明指向结构的指针,取一个结构变量的地址,也可以声明结构数组。


二.结构声明


1.在声明结构时,必须列出它包含的所有成员。该列表包括每个成员的类型和名字。


eg:


struct tag{


member-list;


}variable-list;


结构体声明由三部分组成,tag,member-list,variable-list。所有可选部分不能全部省略---它们至少出现两个。


1>例子:


struct {


int a;


char b;


float c;


}x;


这个声明创建了一个名叫x的变量,它包含三个成员:一个整数、一个字符和一个浮点数。


struct {


int a;


char b;


float c;


}y[20],*z;


这个声明创建了y和z。y是一个数组,它包含了20个结构。Z是一个指针,它指向这个类型的结构。


2>说明:


以上两个声明被编译器当作两种截然不同的类型,即使它们的成员列表完全相同。因此,变量y和z的类型和x的类型不同,所以下面这条语句。


z = &x;是非法的


3>但是,这是不是意味着某种特定类型的所有结构都必须使用一个单独的声明来创建呢。其实不然,标签(tag)字段允许为成员列表提供一个名字。


eg:


struct SIMPLE {


int a;


char b;


float c;


};


这个声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并未创建任何变量。


² 标签标识了一种模式,用于声明未来的变量,但无论是标签还是模式本身都不是变量。


eg struct SIMPLE x;


struct SIMPLE y[20],*z;


这些声明使用标签来创建变量。它们创建和前面的例子是一样的,不同的是:现在x,y和z都是同一种类型的结构变量。


2.声明结构时可以使用的另一种良好技巧是用typedef创建一种新的类型。


typedef struct {


int a;


char b;


float c;


} Simple;


这个技巧和声明一个结构标签的效果几乎相同。区别在于:Simple现在是个类型名而不是个结构标签,所以后续的声明可能像下面:


Simple x;


Simple y[20],*z;


注:如果想在多个源文件中使用同一种类型的结构,你应该把标签声明或typedef形式的声明放在一个头文件中。当源文件需要使用这个声明时可以使用#include指令把该头文件包含进来。


3.结构成员


1>结构成员可以是任何变量。结构成员可以是标量,数组,指针或者是其他结构。


2>一个结构的成员的名字可以和其他结构的成员的名字相同。并不会产生冲突。


三.结构成员的访问


1.结构成员的直接访问


结构变量的成员是通过点操作符号(.)访问的。点操作符接受两个操作数,左操作数就是结构变量的名字,右操作数就是需要访问的成员的名字。这个表达式的结果就是指定的成员。


2.结构体成员的间接访问


如果你拥有一个指向结构的指针,我们使用->操作符(箭头操作符)和点操作符一样,箭头操作符对左操作符执行间接访问取得指针所指向的结构,然后和点操作符一样,根据右操作数选择一个指定的结构成员。


3.结构的自引用


在一个结构内部包含一个类型为该结构本身的成员是否是合法呢?


Eg:


struct SELF_REF1 {


int a;


struct SELF_REF1 b;


int c;


};


该中类型的应用是非法的,因为成员b是另一个完整的结构,其内部还将包含它自己的成员b。这第2个成员又是另一个完整的结构,它还将包含它自己的成员b。这样就会永无止境。


1>下面的方法是合法的


struct SELF_REF2 {


int a;


struct SELF_REF2 *b;


int c;


};


这个声明和前面的声明区别在于b现在是一个指针而不是结构。编译器在结构的长度确定之前就已经知道指针的长度。所以该中类型的自引用是合法的。


2>以下是个错误的用法


typedef struct {


int a;


SELF_REF3 *b;


int c;


}SELF_REF3


该声明的目的是为这个结构创建类型名SELF_REF3。但是,它是错误的,类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义。


使用一个结构标签来声明b,如下所示:


typedef struct SELF_REF3_TAG {


int a;


struct SELF_REF3_TAG *b;


int c;


}SELF_REF3;


4.不完整的声明


有时候,你必须声明一些相互之间存在依赖的结构。即:其中一个结构包含了另一个结构的一个成员或多个成员。和自引用一样,至少有一个结构必须在另一个结构体内部以指针的形式存在。问题在于声明部分:如果每个结构都引用了其他结构的标签,哪个结构应该首先被声明呢?


1>该问题采用不完整声明来解决。它声明一个作为结构标签的标识符。然后,把这个标签用在不需要知道这个结构的长度的声明中,如声明指向这个结构的指针。接下来的声明把这个标签与成员列表联系在一起。


2>看下面的例子,两个不同类型的结构内部都有一个指向另一个结构的指针。


struct B;


struct A {


struct B *partner;


/*other declarations*/


};



struct B {


struct A *partner;


/*other declarations*/


};


在A成员列表中需要标签B的不完整的声明。一旦A被声明之后,B的成员列表也可以被声明。


四结构的初始化


1.结构的初始化方式和数组的初始化方式很相似。一个位于一对花括号内部、由逗号分隔的初始值列表可用于结构各个成员的初始化。这些值根据结构成员列表的顺序写出。如果初始列表的值不够,剩余的结构成员将使用缺省值进行初始化。


2.结构中如果包含数组或结构成员,其初始化方式类似于多维数组的初始化。一个完整的聚合类型成员的初始值列表可以嵌套于结构的初始值列表内部。


eg:


struct INIT_EX {


int a;


short b[10];


Simple c;


}x = {


10;


{1,2,3,4,5},


{25,’x’,1.9}


};


关键字:C语言  结构体  基础知识 引用地址:C语言复习之结构体基础知识

上一篇:C语言中随机函数应用
下一篇:嵌入式C代码优化

推荐阅读最新更新时间:2024-03-16 16:18

LED的使用纯汇编和C语言的点亮
概述 我们通过观察原理图可以发现LED灯有四个分别连接在GPM4_1, GPM4_2, GPM4_3 GPM4_4上面,这时候我们去查询我们板子4412的说明书,去寻址寄存器的配置 初始化的时候我们需要将他配置为输出模式,同时我们观察下面的电路可以发现,他需要输出低电平,来使led亮 #define GPM4BASE 0x11000000 #define GPM4CON 0x02E0 #define GPM4DAT 0x02E4 #define UDELAY 0x43e2647c #define N 5000000 .text .align 2 .global _start _start: mo
[单片机]
LED的使用纯汇编和<font color='red'>C语言</font>的点亮
PIC单片机CCS之C语言(#USE DELAY的用法)
#USE DELAY 语法: #use delay(clock=speed) 或 #use delay(clock=speed, restart_wdt) speed是一个常数,范围为1~100000000(1hz~100mhz) 目的: 将处理器的速度告诉给编译器,使能内置函数的功能:delay_ms()和delay_us().速度是每秒周期数.可选项restart_wdt使编译器在延时的时候重新启动WDT. 例子:#use delay(clock=20000000) #use delay(clock=32000,RESTART_WDT) 例子文件:ex_sqw.c;该文件在前面已经叙述过了
[单片机]
51单片机串口调试程序C语言
/*定义为中断方式串口处理*/ #define INTERSENDSTR /*不为8032系列芯片 */ //#define CHIP_8032 #include absacc.h #include reg51.h #include string.h #include err.h #ifdef INTERSENDSTR unsigned char xdata sSendComBuf ,sRecComBuf ; unsigned char data bOut,bIn,bSout,bSin; #else #define DEFSENDCHAR TI=0;SBUF=ACC;while(!TI);TI=0; #endif
[单片机]
浮地测量和隔离输入示波器基础知识
本应用指南将介绍电源测量术语,阐述为进行浮地测量提供的不同选项,重点介绍每种选项的优点和缺点。 最苛刻的浮地测量要求源自电源控制电路,如马达控制器、不间断电源和工控设备。在这些应用领域中,电压和电流可能会很大,足以给用户和/或测试设备带来危险。在测量浮地高压信号时,有许多选项可以考虑。每个选项都有自己的优点和缺点。 差分测量与浮地测量比较 所有电压测量都是差分测量。差分测量定义为两点之间的电压差。电压测量分成两类: 1. 参考地电平测量 2. 非参考地电平测量(也称为浮地测量) 传统示波器 大多数传统示波器把"信号参考"端子连接到保护接地系统上,通常称为"接地".通过这种方式,所有应用到示波器的信号或示波器提供的信号
[测试测量]
浮地测量和隔离输入示波器<font color='red'>基础知识</font>
AVR单片机学习C语言的流水灯验证
AVR 的IO口简介与寄存器的概念 一、何谓“寄存器” 寄存器就是RAM中的一些特殊单元,映射片上外设的特殊功能 二、何谓“IO口” 可以将 0 与1转换为电压信号的端口 单片机中最常用的TTL电平:0V代表“0”,+5V 代表“1” Mega16有4个IO口,PA,PB,PC,PD 三、IO口的性能指标 灌电流能力:能够流入IO口的最大电流 拉电流能力:能够从IO口流出的最大电流 上拉电阻与下拉电阻 最大输入电压 IO口的两种状态 如上图(有个选择开关实际电路中不存在的为了好理解才给出的)输出就是 要么给个5V 要么给个地 0V 就是输出0 和 1 上图输入模型 理想的输入
[单片机]
AVR单片机学习<font color='red'>C语言</font>的流水灯验证
信号链基础知识 RS-485:总线电流要求与收发器驱动能力
越来越多的人在问关于 EIA/TIA-485(俗称 RS-485 数据传输标准)基本概念的一些问题,这一事实表明未来数年 RS-485 仍会在各种工业接口中起到举足轻重的作用。   本文中,我们将为您解答许多常见和最新的问题,例如: 1)RS-485 收发器可以驱动多大的总线电流? 2)可以驱动 32 以上单位负载吗?   要回答第一个问题,我们需要研究 图 1 所示典型 RS-485 数据链路。我们看到,除驱动通过端接电阻器的差分电流以外,驱动器还必须驱动通过许多接收机输入阻抗的电流,以及通过位于总线上的故障保护网络的电流。这些阻抗在差分信号线路和接地之间形成电流通路,同时影响了 A 和 B 信号线的电流
[嵌入式]
单片机C语言程序-依次点亮八个LED灯
电路很简单八个led灯接在p1口.运行后看到的效果是 从第一个灯开始 随着时间变化 二进制数的递减 所有的灯都会依次的点亮,当全部的灯都被点亮后再重新开始这个过程 一直循环下去 单片机是不是很有趣? 下面是c语言程序源码 #include reg51.h void delay100ms(); //如果函数是在主函数后面定义,那么一定要在主函数前面声明 void main() { int i; i=0xfe; while(1) {P1=i; i--; delay100ms(); if(i==0) i=0xfe; } } void delay100ms(vo
[单片机]
小容量单片机系统的C语言程序结构
引 言:   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机87LPC764,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved