C语言指针结构和联合

上传人:woxinch****an2018 文档编号:38631019 上传时间:2018-05-05 格式:DOC 页数:19 大小:106KB
返回 下载 相关 举报
C语言指针结构和联合_第1页
第1页 / 共19页
C语言指针结构和联合_第2页
第2页 / 共19页
C语言指针结构和联合_第3页
第3页 / 共19页
C语言指针结构和联合_第4页
第4页 / 共19页
C语言指针结构和联合_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《C语言指针结构和联合》由会员分享,可在线阅读,更多相关《C语言指针结构和联合(19页珍藏版)》请在金锄头文库上搜索。

1、C C 语言基础教程:指针、结构、联合和枚举语言基础教程:指针、结构、联合和枚举本节专门对第二节曾讲述过的指针作一详述。并介绍 Turbo C 新的数据类型: 结构、联合和枚举, 其中结构和联合是以前讲过的五种基本数据类型(整型、浮 点型、字符型、指针型和无值型)的组合。 枚举是一个被命名为整型常数的集合。 最后对类型说明(typedef)和预处理指令作一阐述。1 1、 指指 针针(point)(point)学习 Turbo C 语言, 如果你不能用指针编写有效、正确和灵活的程序, 可以 认为你没有学好 C 语言。指针、地址、数组及其相互关系是 C 语言中最有特色的部 分。规范地使用指针, 可

2、以使程序达到简单明了, 因此, 我们不但要学会如何正 确地使用指针, 而且要学会在各种情况下正确地使用指针变量。 1. 指针和地址 1.1 指针基本概念及其指针变量的定义 1.1.1 指针变量的定义 我们知道变量在计算机内是占有一块存贮区域的, 变量的值就存放在这块区 域之中, 在计算机内部, 通过访问或修改这块区域的内容来访问或修改相应的变 量。Turbo C 语言中, 对于变量的访问形式之一, 就是先求出变量的地址, 然后 再通过地址对它进行访问, 这就是这里所要论述的指针及其指针变量。 所谓变量的指针, 实际上指变量的地址。变量的地址虽然在形式上好象类似 于整数, 但在概念上不同于以前介

3、绍过的整数, 它属于一种新的数据类型, 即指 针类型。Turbo C 中, 一般用“指针“来指明这样一个表达式 则 首先说明了它是一指针类型的变量, 注意在定义中不要漏写符号“*“, 否则它为 一般的整型变量了。另外, 在定义中的 int 表示该指针变量为指向整型数的指针 类型的变量, 有时也可称 ip 为指向整数的指针。ip 是一个变量, 它专门存放整型 变量的地址。 指针变量的一般定义为: 类型标识符 *标识符; 其中标识符是指针变量的名字, 标识符前加了“*“号, 表示该变量是指针变 量, 而最前面的“类型标识符“表示该指针变量所指向的变量的类型。一个指针变 量只能指向同一种类型的变量,

4、 也就是讲, 我们不能定义一个指针变量, 既能指 向一整型变量又能指向双精度变量。 指针变量在定义中允许带初始化项。如: int i, *ip= 注意, 这里是用 ip=100; 假设 int i=200, x; int *ip; 我们定义了两个整型变量 i, x, 还定义了一个指向整型数的指针变量 ip。i, x 中 可存放整数, 而 ip 中只能存放整型变量的地址。我们可以把 i 的地址赋给 ip: ip= 此时指针变量 ip 指向整型变量 i, 假设变量 i 的地址为 1800, 这个赋值可形象理解 为下图所示的联系。 ip i 1800 200 图 1. 给指针变量赋值 以后我们便可以

5、通过指针变量 ip 间接访问变量 i, 例如: x=*ip; 运算符*访问以 ip 为地址的存贮区域, 而 ip 中存放的是变量 i 的地址, 因此, *ip 访问的是地址为 1800 的存贮区域(因为是整数, 实际上是从 1800 开始的两个字节), 它就是 i 所占用的存贮区域, 所以上面的赋值表达式等价于 x=i; 另外, 指针变量和一般变量一样, 存放在它们之中的值是可以改变的, 也就 是说可以改变它们的指向, 假设 int i, j, *p1, *p2; i=a; j=b; p1= p2= 则建立如下图所示的联系: p1 i a p2 i b 图 2. 赋值运算结果 这时赋值表达式:

6、 p2=p1 就使 p2 与 p1 指向同一对象 i, 此时*p2 就等价于 i, 而不是 j, 图 2.就变成图 3.所示: p1 i a p2 j b 图 3. p2=p1 时的情形 如果执行如下表达式: *p2=*p1; 则表示把 p1 指向的内容赋给 p2 所指的区域, 此时图 2.就变成图 4.所示 p1 i a p2 j a 图 4. *p2=*p1 时的情形 通过指针访问它所指向的一个变量是以间接访问的形式进行的, 所以比直接 访问一个变量要费时间, 而且不直观, 因为通过指针要访问哪一个变量, 取决于 指针的值(即指向), 例如“*p2=*p1;“实际上就是“j=i;“, 前者

7、不仅速度慢而且目 的不明。但由于指针是变量, 我们可以通过改变它们的指向, 以间接访问不同的 变量, 这给程序员带来灵活性, 也使程序代码编写得更为简洁和有效。 指针变量可出现在表达式中, 设 int x, y *px= 指针变量 px 指向整数 x, 则*px 可出现在 x 能出现的任何地方。例如: y=*px+5; /*表示把 x 的内容加 5 并赋给 y*/ y=+*px; /*px 的内容加上 1 之后赋给 y +*px 相当于+(px)*/ y=*px+; /*相当于 y=*px; px+*/ 1.2. 地址运算 指针允许的运算方式有: (1). 指针在一定条件下, 可进行比较, 这

8、里所说的一定条件, 是指两个指 针指向同一个对象才有意义, 例如两个指针变量 p, q 指向同一数组, 则, =, 12)?name0:namen); main() int i; for(i=0; i main() struct /*定义一个结构变量*/ char name8; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; a; FILE *fp; float wage; char c=Y; fp=fopen(“wage.dat“, “w“); /*创建一个文件只写*/ while(c=Y

9、|c=y) /*判断是否继续循环*/ printf(“nName:“); scanf(“%s“, a.name); /*输入姓名*/ printf(“Age:“); scanf(“%d“, /*输入年龄*/ printf(“Sex:“); scanf(“%d“, a.sex); printf(“Dept:“); scanf(“%s“, a.depart); printf(“Wage1:“); scanf(“%f“, /*输入工资*/ printf(“Wage2:“); scanf(“%f“, printf(“Wage3:“); scanf(“%f“, printf(“Wage4:“); sca

10、nf(“%f“, printf(“Wage5:“); scanf(“%f“, wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5; printf(“The sum of wage is %6.2fn“, wage);/*显示结果*/ fprintf(fp, “%10s%4d%4s%30s%10.2fn“, /*结果写入文件*/ a.name, a.age, a.sex, a.depart, wage); while(1) printf(“Continue?“); c=getche(); if(c=Y|c=y|c=N|c=n) break; fclose(f

11、p); 3. 结构数组和结构指针 结构是一种新的数据类型, 同样可以有结构数组和结构指针。 一、结构数组 结构数组就是具有相同结构类型的变量集合。假如要定义一个班级 40 个同学 的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示: struct char name8; char sex2; int age; char addr40; student40; 也可定义为: struct string char name8; char sex2; int age; char addr40; ; struct string student40; 需要指出的是结构数组成员的访问是以数组元素为

12、结构变量的, 其形式为: 结构数组元素.成员名 例如: student0.name student30.age 实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是 一个结构变量, 第二维是结构成员。 注意: 结构数组的成员也可以是数组变量。 例如: struct a int m35; float f; char s20; y4; 为了访问结构 a 中结构变量 y2的这个变量, 可写成 y2.m14 二、结构指针 结构指针是指向结构的指针。它由一个加在结构变量名前的“*“ 操作符来定 义, 例如用前面已说明的结构定义一个结构指针如下: struct string char n

13、ame8; char sex2; int age; char addr40; *student; 也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。 struct string *student; 使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式 上有所不同。结构指针对结构成员的访问表示为: 结构指针名-结构成员 其中“-“是两个符号“-“和“的组合, 好象一个箭头指向结构成员。例如要 给上面定义的结构中 name 和 age 赋值, 可以用下面语句: strcpy(student-name, “Lu G.C“); student-age=18; 实际上,

14、student-name 就是(*student).name 的缩写形式。 需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地 址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下: student=(struct string*)malloc(size of (struct string); size of (struct string)自动求取 string 结构的字节长度, malloc() 函数 定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。 注意: 1. 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局 部变量和全程变量, 视定义的位置而定。 2. 结构变量名不是指向该结构的地址, 这与数组名的含义不同, 因此

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号