当前位置:
文档之家› 第11章:数组,结构体,共同体(数组已经讲了,
第11章:数组,结构体,共同体(数组已经讲了,
用typedef定义类型
除了可以直接使用C提供的标准类型名(如int、 char、float、double、long等)和自己声明的结构体、 共用体、指针、枚举类型外,还可以用typedef声明 新的类型名来代替已有的类型名。
说明
(1)用typedef可以声明各种类型名,但不能用来定义变 量。用typedef可以声明数组类型、字符串类型,使用比 较方便。 (2)用typedef只是对已经存在的类型增加一个类型名, 而没有创造新的类型。 (3)typedef与#define有相似之处。 (4)当不同源文件中用到同一类型数据时,常用typedef 声明一些数据类型,把它们单独放在一个文件中,然后 再需要用到它们的文件中用#include命令把它们包含进 来。 (5)使用typedef用利于程序的通用与移植。
第十一章:结构类型
数组
数组是有序数据的集合。数组中的每一个元素 都属于同一个数据类型。用一个统一的数组名和下 标来惟一地确定数组中的元素。 定义方式为: 类型说明符 数组名[常量表达式]; 例如:int a[10];
说明
(1)数组名的命名规则和变量名相同,遵循标识符命名规 则。 (2)在定义数组时,需要指定数组中元素的个数,方括号 中的常量表达式用来表示元素的个数,即数组长度。 (3)常量表达式中可以包括常量和符号常量,不能包含变 量。C语言不允许对数组的大小作动态定义,即数组的 大小不依赖于程序运行过程中变量的值。
sex
Mห้องสมุดไป่ตู้
age
18
score
87.5
address
Beijing
struct student { int num; NSString *name; char sex; int age; float score; NSString *address; }
定义结构体类型变量的方法
前面只是指定了一个结构体类型,它相当于一个 模型,但其中并无具体数据,系统对之也不分配实际 内存单元。为了能在程序中使用结构体类型的数据, 应当定义结构体类型的变量,并在其中存放具体的数 据。可以采取以下三种方法定义结构体类型变量。 1、先声明结构体类型再定义变量名 2、在声明类型的同时定义变量 3、直接定义结构体类型变量
例:程序结果是什么?
int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //---------------------------------------int f[20] = {1,1}; for(int i=2;i<20;i++) { f[i] = f[i-2]+f[i-1]; } for(int j=0;j<20;j++) { NSLog(@"%d",f[j]); } //---------------------------------------[pool drain]; return 0; }
共同体的引用方式
只有先定义了共用体变量才能引用它。而且不 能引用共用体变量,而只能引用共用体变量中的成 员。
共同体类型数据的特点
(1)同一个内存段可以用来存放几种不同类型的成 员,但在每一瞬时只能存放其中一种,而不是同时 存放几种。也就是说,每一瞬时只有一个成员起作 用,其他成员不起作用,即不是同时都存在和起作 用。 (2)共用体变量中起作用的成员是最后一次存放的 成员,在存入一个新的成员后原有的成员就失去作 用。 (3)共用体变量的地址和它的各成员的地址都是同 一地址。
结构体变量的初始化
和其他类型变量一样,对结构体变量可以在定 义时指定初始值。
共同体
有时需要使几种不同类型的变量存放到同一段内存 单元中。例如,可把一个整型变量、一个字符型变量、 一个实型变量放在同一地址开始的内存单元中。以上3 个变量在内存中占的字节数不同,但都从同一地址开始。 也就是使用覆盖技术,几个变量互相覆盖。这种使几个 不同的变量共占同一段内存的结构,称为“共用体”类 型的结构。 定义共用体类型变量的一般形式为 union 共用体名 { 成员表列 } 变量表列;
说明
(1)类型与变量是不同的概念,不要混同。只能对变 量赋值、存取或运算,而不能对一个类型赋值、存 取或运算。 (2)对结构体中的成员可以单独使用,它的作用与地 位相当于普通变量。 (3)成员也可以是一个结构体变量。 (4)成员名可以与程序中的变量名相同,二者不代表 同一对象。
结构体变量的引用
在定义了结构体变量以后,当然可以引用这个变 量。但应遵守以下规则: (1)不能将一个结构体变量作为一个整体进行输入和 输出。 (2)如果成员本身又属一个结构体类型,则要用若干 个成员运算符,一级一级地找到最低的一级的成员。 只能对最低级的成员进行赋值或存取以及运算。 (3)对结构体变量的成员可以像普通变量一样进行各 种运算(根据其类型决定可以进行的运算)。 (4)可以引用结构体变量成员的地址,也可以引用结 构体变量的地址。
结构体
我们已介绍了基本类型(或称简单类型)的变量(如整 型、实型、字符型变量等),也介绍了一种构造类型数据 --数组,数组中的各元素是属于同一个类型的。 但是只有这些数据类型是不够的。有时需要将不同类 型的数据组合成一个有机的整体,以便于引用。这些组 合在一个整体中的数据是相互联系的。应当把它们组织 成一个组合项,在一个组合项中包含若干个类型不同的 数据项(当然也可以相同)。C语言允许用户自己指定这样 一种数据结构,它称为结构体。
数组定义是否合法?
int a[];
int i = 3; int a[i];
int 3d[10];
int _c[3];
int b[2+1]
int i = 3; int b[i+3];
数组的初始化
对数组元素的初始化可以用以下方式实现
(1)在定义数组时对数组元素赋予初值。
(2)可以只给一部分元素赋值。
枚举类型
如果一个变量只有几种可能的值,可以定义为 枚举类型。所谓“枚举”是指将变量的值一一列 举出来,变量的值只限于列举出来的值的范围内。
说明
(1)在C编译中,对枚举元素按常量处理,故称枚举常量。它们不是变 量,不能对它们赋值。 (2)枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使 它们的值为0,1,2,…。 (3)枚举值可以用来做判断比较。 (4)一个整数不能直接赋给一个枚举变量。 [例11.14]口袋中有红、黄、蓝、白、黑5种颜色的球各一个。每次从口 袋中先后取出3个球,问得到3种不同色的球的可能取法,输出每种排 列的情况
共同体类型数据的特点
(4)不能对共用体变量名赋值,也不能企图引用变 量名来得到一个值,又不能在定义共用体变量时 对它初始化。 (5)不能把共用体变量作为函数参数,也不能使函 数带回共用体变量,但可以使用指向共用体变量 的指针。 (6)共用体类型可以出现在结构体类型定义中,也 可以定义共用体数组。反之,结构体也可以出现 在共用体类型定义中,数组也可以作为共用体的 成员。
二维数组
二维数组定义的形式为 类型说明符 数组名[常量表达式][常量表达式]; 例如:float a[3][4], b[5][10]; 二维数组可被看作是一种特殊的一维数组:它 的元素又是一个一维数组。 二维数组中元素排列的顺序是按行存放的。即 在内存中先顺序存放第一行的元素,再存放第二 行的元素。
数组的引用
数组必须先定义,然后使用。
数组元素的表示形式为 数组名[下标] 下标可以是整型常量或整型表达式。
例:数组元素的引用
int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //---------------------------------------int a[10]; for(int i=0;i<=9;i++) { a[i]=i; } for(int i=9;i>=0;i--) { NSLog(@"%d",a[i]); } //---------------------------------------[pool drain]; return 0; }
例:程序结果是什么?
int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //---------------------------------------int a[2]={1,2,3}; for(int i=0;i<3;i++) { NSLog(@"%i",a[i]); } //---------------------------------------[pool drain]; return 0; }
结构体定义
声明一个结构体类型的一般形式为 struct 结构体名 { 成员列表; }; “结构体名”用作结构体类型的标志。大括弧内是该结 构体中的各个成员,由它们组成一个结构体。对各成员 都应进行类型声明,即 类型名 成员名; 成员名定名规则与变量名相同。
结构体定义
num
10010
name
LILY
二维数组的初始化
可以用下面的方法对二维数组初始化
(1)可以将所有数据写在一个花括号内,按数组排列的顺序 对各元素赋初值。 (2)可以对部分元素赋初值。
二维数组的引用
二维数组元素的表示形式为 数组名[下标][下标] 例如a[2][3]。 下标可以是整型表达式,如a[2-1][2*2-1]。 数组元素可以出现在表达式中,也可以被赋值。 例如:b[1][2]=a[2][3]/2 下标值应在已定义的数组大小的范围内。常出 现的错误是: int a[3][4]; a[3][4]=3;