C语言教程九
《C语言程序设计教程(第二版)》 第09章-指针(1)
访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数
C语言详细教程(完整版)
C语言详细教程(完整版)一、C语言概述C语言是一种广泛使用的高级编程语言,它具有简洁、高效、灵活的特点。
C语言广泛应用于系统编程、嵌入式系统、游戏开发、驱动程序等多个领域。
学习C语言,不仅可以让你掌握一种强大的编程工具,还可以帮助你理解计算机底层原理,提高编程能力。
二、C语言基本语法1. 数据类型C语言提供了丰富的数据类型,包括整型、浮点型、字符型等。
合理使用数据类型可以优化程序性能,提高代码可读性。
2. 变量与常量变量是程序中用于存储数据的标识符,而常量是在程序运行过程中值不会改变的量。
声明变量时需要指定其数据类型,常量可以使用define或const关键字定义。
3. 运算符C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。
熟练掌握运算符的使用可以提高编程效率。
4. 语句C语言中的语句用于控制程序执行流程,包括条件语句(if、switch)、循环语句(for、while、dowhile)等。
合理使用语句可以使程序结构清晰,易于维护。
5. 函数函数是C语言中的基本代码模块,用于实现特定的功能。
函数可以减少代码重复,提高程序的可读性和可维护性。
6. 数组数组是一种用于存储多个相同类型数据的数据结构。
C语言中的数组可以是一维、二维或多维的,合理使用数组可以优化内存使用。
7. 指针指针是C语言中用于存储变量地址的特殊数据类型。
指针可以用于动态分配内存、传递函数参数等,掌握指针的使用是提高编程能力的关键。
8. 字符串字符串是C语言中用于存储字符序列的数据结构。
C语言提供了丰富的字符串处理函数,如字符串复制、连接、比较等。
9. 文件操作C语言提供了丰富的文件操作函数,如文件打开、读取、写入、关闭等。
合理使用文件操作可以提高程序的数据处理能力。
10. 动态内存分配C语言提供了动态内存分配函数,如malloc、calloc、realloc等。
动态内存分配可以优化内存使用,提高程序性能。
三、C语言高级特性1. 结构体与联合体结构体和联合体是C语言中用于存储不同类型数据的复合数据类型。
C语言程序设计基础教程-9.3文件包含
file3.c 不包含# include命令
……
C语言程序设计 文件包含
说明
C语言
4、被包含文件(file2.c)与使用该文件的源文件file1.c,在预编译后将成为同一个文 件,而不是两个文件,因此如果file2.c中包含全局静态变量,在file1.c文件中也 可以正常使用,不必用extern声明。
C语言程序设计 文件包含
带参数的宏定义 函数与带参宏的区别
C语言
C语言程序设计—文件包含
本次任务
输入半径,求
圆的面积
C语言
内容
CONTENTS
01 什么是文件包含 02 关于文件包含的几点说明
03
任务实现
01
什么是文件包含
C语言程序设计 文件包含
什么是文件包含
C语言
包含命令 #include <stdio.h> 所谓“文件包含”是指一个源文件可以将另外一个源文件的全
C语言程序设计 文件包含
说明:
C语言
2、如果文件file1包含文件file2,而文件file2中要用到文件file3的内容,则可以在文 件1中用两个include 命令分别包含文件2和文件3,而且文件3应出现在文件2之前。
file1.c file2.c
file2.c
包含
file3.c
file1.c
编译预处理时,程序按照#define命令行中指定的字符串 从左 到右进行置换:area=a*b
C语言程序设计 文件包含
C语言
文件包含的含义
file1.c
file2.c
file3.c
预编译后的
#include “file3.c” #include “file2.c”
919149-C语言程序设计教程——面向计算思维和问题求解-第9章-新
9.2.2 嵌套结构体的定义
结构体成员的类型也可以是结构体,这时形成了 结构体的嵌套。
例如,若将引例中学生的年龄“age”改为出生 日期“birthday”,则由于birthday本身含有“年、 月、日”信息,应该为结构体型date的变量,故结 构体stu的定义如下:
9.2.2 嵌套结构体的定义
语言程序设计教程
面向计算思维和问题求解
第9章 复杂结构数据处理
结构体 结构体变量 结构体数组 结构体指针 结构体与函数 结构体与链表 枚举
9.1.1 问题描述
学生信息中包括学号、姓名、性别、年龄(或者 出生日期)和成绩。其中学号和年龄为整型数据、姓 名为字符串、性别为字符型数据、成绩则是浮点型数 据。各数据项的类型不尽相同,它们的组合才能描述 一个学生的信息。若要管理一批学生的相关信息,要 求实现以下操作应如何实现?
#include <stdio.h> struct stu
{
int num;
char name[20];
char sex;
int age;
/*用年龄描述学生的信息*/
float score;
};
例9-3 源代码(续1)
void main( ) {
struct stu student[5]={ {101,"Li ping",'M', 18,45}, {102,"Zhang ping",'M',18,62.5}, {103,"He fang",'F',18,92.5}, {104,"Cheng ling",'F',18,87}, {105,"Wang ming",'M',18,58} };
C语言程序设计-谭浩强-第9章预处理命令
17/14
§9.1 宏定义 宏体可缺省,表示宏名
不带参数宏定义
定义过或取消宏体
一般形式: 宏体] 一般形式: #define 宏名 [宏体 宏体 功能:用指定标识符 宏名)代替字符序列 宏体) 用指定标识符(宏名 代替字符序列(宏体 功能 用指定标识符 宏名 代替字符序列 宏体
如 #define 定义位置:任意YES 1 一般在函数外面) 定义位置 任意(一般在函数外面 任意 一般在函数外面 #define 例 NO 0 YES #define 1 作用域:从定义命令到文件结束 作用域 从定义命令到文件结束 main() #define PI 3.1415926 #define OUT printf(“Hello,World”); { …….. YES原作用域 #undef可终止宏名作用域 可 } 格式: 格式: #undef 宏名 #undef YES 宏展开:预编译时,用宏体替换宏名 用宏体替换宏名---不作语法检查 宏展开:预编译时 用宏体替换宏名 不作语法检查 #define YES 0 max() 引号中的内容与宏名相同也不置换 YES新作用域 {…….. if(x==YES)WIDTH 80 如 例 #define WIDTH 80 printf(“correct!\n”); 例 #define 宏定义可嵌套, 宏定义可嵌套,不能递归 } else if (x==NO)( WIDTH+40 ) printf(“error!\n”); #define #define LENGTH 3.14159 例 #define PI LENGTH WIDTH+40 宏定义中使用必要的括号() 宏定义中使用必要的括号() 展开后: if(x==1) 展开后var=LENGTH*2; : var=LENGTH*2;printf(“correct!\n”); (×) printf(“2*PI=%f\n”,PI*2); 例 #define MAX MAX+10 × else 宏展开: 宏展开: :printf(“2*PI=%f\n”,3.14159*2); 宏展开 宏展开:var= ((x==0) ) * 2;printf(“error!\n”); 宏展开: if 80+40 宏展开 :var= 80+40*2;
C语言程序设计 第3版 第9章 编译预处理
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
c语言第9章_指针及其应用(1)课后复习重点[1]教程
指针变量在使用前
必须赋值!
swap(pointer_1,pointer_2);
printf("a=%d,b=%d\n", *pointer_1,*pointer_2); return 0; } 2018/11/2
运行结果:
a:10 *pa:10
...
printf("&pa:%x(hex)\n",&pa);
return 0; }
&a:f86(hex)
pa:f86(hex) &pa:f8a(hex)
16
2018/11/2
例:输入两个数,并使其从大到小输出
int main()
{
int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b);
24
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; int x,*p=&x; *p=*p1; *p1=*p2; *p2=*p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
2018/11/2
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2018/11/2
C语言程序设计基础教程 9.4、条件编译
C语言
输出结果
从左
04
总 结
C语言程序设计—条件编译
C语言
1. 宏定义
2. 文件包含
3. 条件编译
C语言程序设计—条件编译
C语言
1 不 带 参 宏 定 义 4
2 3
宏定义的格式 # define 标识符 字符串
使用宏名代替一个字符串,可以减少程序中重复书写某些“字符串”的 工作量。
宏定义是用宏名代替字符串,只做简单的置换,不作正确性检查。
条件编译的三种形式
C语言
什么是条件编译
一般情况下,源程序中所有行都参加编译。但是有时希望对其 中一部分内容只在满足一定条件才进行编译,即对一部分内容 指定编译的条件,这就是“条件编译”。
02
条件编译的三种形式
C语言程序设计 条件编译
C语言
第一种形式:
#ifdef 标识符
程序段1
#else 程序段2
说明
作用:当标识符已经被定义过(一般是用 define命
C语言程序设计 条件编译
C语言
什么是文件包含 文件包含的一般形式 关于文件包含的几点说明
C语言程序设计—条件编译
C语言
本次任务
采用条件编译,实现给定字符串使之全
改为大写输出,或全改为小写输出。
01
什么是条件编译
内容
CONTENTS
02
条件编译的三种形式
03
任务实现
04
总结
01
什么是条件编译
C语言程序设计 条件编译
令定义),则对程序段1进行 编译;否则编
译程序段2。 注意:其中#else 程序段2可以没有。
#endif
(完整版)C语言程序设计第四版第九章答案谭浩强
The shortest way to do many things is
average=0; max=0; maxi=0; for(i=0;i<3;i++) {sum=0; for(j=0;j<3;j++)
sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) {max=sum; maxi=I; } } average/=N; printf(“NO. name score1 score2 score3 average\n”); for(I=0;I<N;I++) {printf(“%5s%10s”,stu[i].num, stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“%8.2f\n”,stu[i].avr); } printf(“average=%6.2f\n”,average); printf(“The highest score is:%s,score total:%d.”stu[maxi].name,max); } 9.6 编写一个函数 new,对 n 个字符开辟连续的存储空间,此函数应返回一个指针,指向字 符串开始的空间。New(n)表示分配 n 个字节的内存空间。 解:new 函数如下: #define NULL 0 #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; char *new(int n) {if (newp+n<=newbuf+ NEWSIZE)
C语言程序设计活页式教程 课件 项目9
任务2 指针访问数组
【任务准备】 4. 二维数组的行指针 (1)指向二维数组的一般指针变量
在项目 6 中讲解过二维数组,二维数组有行和列,例如: short arr [2][3]= {{12,3,0}, {23,0,0}} ; (2)指向二维数组的行指针变量
任务3 指针访问字符串和函数
【任务实现】 训练 1 :从终端输入密码 ,编写一个密码检测程序 ,要求输出如下信息 ************************ 请输入密码: shdwa1234 密码位数错! ************************ 请输入密码: pwd_43 密码错! ************************ 请输入密码: pwd_ 12 密码正确 ,欢迎!
任务1 指针访问变量
【任务实现】 训练 1:食品店有鲜牛奶 、酸奶 、鲜榨果汁等商品 ,可提供“每月优惠订购 , 每日 送货到家 ”服务, 小红订购了一种商品 , 快递员在小红家安装了一个收件箱 , 每日按 时送货 。用函数调用的方法来模 拟一下这个收发商品的过程吧 。编程实现 , 要求输出 如下信息。 (1)训练分析
任务1 指针访问变量
【任务准备】 (3)直接访问与间接访问 变量的访问方式有两种: 直接访问和间接访问。 直接访问:按变量地址存取变量值(内容)的方式称为直接访问 ,如图 所示。 间接访问: 如果变量的地址存储在另一个变量的存储单元中, 如图 所示 , 变量 a 的地址存储在变量 p 的存储单元中 , 此时 , 需要先访问变量 p ,取得变量 p 的值(变量 a 的地址) ,通过该地址再存取变量 a 的值 ,这种方式称为间接访问。
C语言教程char09
scanf("%d",&a);
sq=160/SQ(a+1);
printf("sq=%d\n",sq);
}
以上讨论说明,对于宏定义不仅应在参数两侧加括号,也应在整个字符串外加括号。
5.带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。
5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
例如:
#define PI 3.1415926
#define S PI*y*y /* PI是已定义的宏名*/
对语句:
printf("%f",S);
在宏代换后变为:
printf("%f",3.1415926*y*y);
【例9.1】
#define M (y*y+3*y)
main(){
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=3*M+4*M+5*M;
printf("s=%d\n",s);
}
上例程序中首先进行宏定义,定义M来替代表达式(y*y+3*y),在s=3*M+4*M+5* M中作了宏调用。在预处理时经宏展开后该语句变为:
INTEGER a,b;
应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
C语言程序设计实例教程第2版习题答案作者李红第9章结构体和共用体.doc
9.4课后习题9.4.1项目练习一.练习目的1.进一步巩固结构体类型和共用体类型的定义与引川2.进一步复习链表的建立过程3.进一步巩固枚举类型的定义与枚举元索的引用方法二.练习内容1.用结构体变量表示平面上的一个点(横坐标和纵坐标),输入两个点,求两点Z间的距离。
#include "stdio.h"include "math.h"struct pin{float x;float y;}a,b;main(){printfC*请输入a点的横纵坐标:“);scanf("%f%f"/&a.x,&a.y);printfC'Xn");printf("请输入b点的横纵坐标scanf(,,%f%f"/&b.x,&b.y);printf("\n n);printff"输出a、b 两点之间的距离是:%f",sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));getch();}2.16个同学围成一-圈,从笫1个人开始按1、2、3的顺序报号,凡报到3者退出圈子。
找出最后昭在圈子中的人原来的序号。
ttinclude "stdio.h"#include "stdlib.h"#define LEN sizeof(struct game)struct game{int num;struct game *next;};struct game *creat(){ struct game *head,*p;head=p=(struct game *) malloc(LEN);p->num=l;int i=2;while(i<=16){ p・>next=(struct game *) malloc(LEN);p->next-:>nu m=i;i++;p=p->n ext; }p->next=head; return(head);} struct game *delete(struct game *head) { struct game*pl=head,*p2=head,*x; int k=l;while(pl->next!=pl) {if(k==3) {x=pl; pl=pl->next;p2・>n ext=pl; free(x); x=NULL; k=0;} else {P2=pl; pl=pl->next;}pl->next=NULL;return(pl);}void print(struct game *head){ struct game *p;p=head;while(p!=NULL) {printf("%d\t",p->num);p=p->n ext;}printfCAn");}main(){ struct game *pt,*p;pt=creat();p=delete(pt);print(p);free(p);getch();}3.建立一个链表,每个结点包含的成员为:职工号、工资。
C语言基础教程课件(英文版)ch09
A First Book of ANSI C, Fourth Edition
13
String Processing (continued)
A First Book of ANSI C, Fourth Edition
14
Library Functions
Note: Attempting to copy a larger string into a smaller string causes the copy to overflow the destination array beginning with the memory area immediately following the last array element.
The starting address of the string1 string is: 1244836
A First Book of ANSI C, Fourth Edition 20
Character Routines
A First Book of ANSI C, Fourth Edition
A First Book of ANSI C, Fourth Edition
2
String Fundamentals
• A string literal is any sequence of characters enclosed in double quotes
– "Good Morning!" – Also called: string constant, string value, string – A string is stored as an array of characters terminated by an end-of-string symbolic constant named NULL ('\0')
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如表示星期的 SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY, 就是一个枚举。 枚举的说明与结构和联合相似, 其形式为: enum 枚举名 { 标识符[=整型常数], 标识符[=整型常数], ... 标识符[=整型常数], }枚举变量; 如果枚举没有初始化,即省掉=整型常数时,则从第一个标识符开始,顺次赋给标识符 0,1,2, ...。但当 枚举中的某个成员赋值后, 其后的成员按依次加 1 的规则确定其值。 例如下列枚举说明后,x1, x2, x3, x4 的值分别为 0, 1, 2, 3。 enum string{x1, x2, x3, x4}x; 当定义改变成: enum string { x1, x2=0, x3=50, x4, }x; 则 x1=0, x2=0, x3=50, x4=51 注意: 1. 枚举中每个成员(标识符)结束符是,, 不是;, 最后一个成员可省略,。 2. 初始化时可以赋负数, 以后的标识符仍依次加 1。 3. 枚举变量只能取枚举说明结构中的某个标识符常量。 例如: enum string
二、结构和联合的区别 1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被 选中的成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同 成员赋值互不影响的。 下面举一个例了来加深对联合的理解。
实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二 维是结构成员。 注意: 结构数组的成员也可以是数组变量。 例如: struct a { int m[3][5]; float f; char s[20]; }y[4]; 为了访问结构 a 中结构变量 y[2]的这个变量, 可写成 y[2].m[1][4] 2.结构指针 结构指针是指向结构的指针。它由一个加在结构变量名前的* 操作符来定义, 例如用前面已说明 的结构定义一个结构指针如下: struct string { char name[8]; char sex[4]; int age; char addr[40]; }*student; 也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。 struct string *student; 使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式上有所不同。结构指 针对结构成员的访问表示为: 结构指针名->结构成员 其中->是两个符号-和>的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中 name 和 age 赋值,可以用下面语句: strcpy(student->name, Lu G.C); student->age=18; 实际上, student->name 就是(*student).name 的缩写形式。 需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地址, 因此在使用之前 应该对结构指针初始化, 即分配整个结构长度的字节空间,这可用下面函数完成, 仍以上例来说 明如下: student=(struct string*)malloc(size of (struct string)); size of (struct string)自动求取 string 结构的字节长度,malloc()函数定义了一个大小为结构长度的内 存区域, 然后将其诈地址作为结构指针返回。
struct { char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; } Tianyr, Liuqi;
二、结构变量的使用 结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构 变量以成员作为基本变量。 结构成员的表示方式为: 结构变量.成员名 如果将结构变量.成员名看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。 下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和, 并显示运算结果。请注意这个例子中不同结构成员的访问。
注意: 1. 结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量, 视 定义的位置而定。 2. 结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员 的首地址应该是&[结构变量名]。
3. 结构的复杂形式:嵌套结构 嵌套结构是指在一个结构成员中可以包括其它一个结构,Turbo C 允许这种嵌套。 例如: 下面是一个有嵌套的结构 struct string { char name[8]; int age; struct addr address; } student; 其中: addr 为另一个结构的结构名, 必须要先进行, 说明, 即 struct addr { char city[20]; unsigned lon zipcode; char tel[14]; } 如果要给 student 结构中成员 address 结构中的 zipcode 赋值, 则可写成: student.address.zipcode=200001; 每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是: 结构变量名.嵌套结构变量名.结构成员名 其中: 嵌套结构可以有很多,结构成员名为最内层结构中不是结构的成员名
number.half.second='b'; printf(%x\n, number.i); getch(); } 输出结果为: AB 6261 从上例结果可以看出: 当给 i 赋值后, 其低八位也就是 first 和 second 的值;当给 first 和 second 赋 字符后,这两个字符的 ASCII 码也将作为 i 的低八位和高八位。 简单的说,就是联合里面的所有变量共用一个内存区域,区域大小是所有变量中最大的那个。改 动某一个变量的值,其他的值也会随之改变。
main() { union { /*定义一个联合*/ int i; struct { /*在联合中定义一个结构*/ char first; char second; }half; }number; number.i=0x4241; /*联合成员赋值*/ printf(%c%c\n, number.half.first, mumber.half.second); number.half.first='a'; /*联合中结构成员赋值*/
scanf(%d, &a.wage); /*输入年龄*/ printf(Sex:); scanf(%s, a.sex); printf(Dept:); scanf(%s, a.depart); printf(Wage1:); scanf(%f, &a.wage1); /*输入工资*/ printf(Wage2:); scanf(%f, &a.wage2); printf(Wage3:); scanf(%f, &a.wage3); wage=a.wage1+a.wage2+a.wage3; printf(The sum of wage is %6.2f\n, wage); printf(Continue?); c=getche(); } }
19 联合和枚举
联合(union): 一、联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合说明和联合变量定义与结构十分相似。其形式为: union 联合名 { 数据类型 成员名; 数据类型 成员名; ... }联合变量名; 联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。 下例表示说明一个联合 a_bc: union a_bc { int i; char mm; }; 再用已说明的联合可定义联合变量。 例如用上面说明的联合定义一个名为 lgc 的联合变量,可写成: union a_bc lgc;
在联合变量 lgc 中, 整型量 i 和字符 mm 公用同一内存位置。 当一个联合被说明时, 编译程序自动地产生一个变量,其长度为联合中最大的变量长度。 联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也 要用->符号, 此时联合访问成员可表示成: 联合名->成员名 另外, 联合既可以出现在结构内, 它的成员也可以是结构。 例如: struct { int age; char *addr; union { int i; char *ch; }x; }y[10]; 若要访问结构变量 y[1]中联合 x 的成员 i, 可以写成: y[1].x.i; 若要访问结构变量 y[2]中联合 x 的字符串指针 ch 的第一个字符可写成: *y[2].x.ch; 若写成 y[2].x.*ch;是错误的。
#include main() { struct { /*定义一个结构变量*/ char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; }a; float wage; char c='Y'; while(c=='Y'||c=='y') /*判断是否继续循环*/ { printf(\nName:); scanf(%s, ); /*输入姓名*/ printf(Age:);
三、结构数组和结构指针 结构是一种新的数据类型, 同样可以有结构数组和结构指针。 1.结构数组 结构数组就是具有相同结构类型的变量集合。假如要定义一个班级 40 个同学的姓名、性别、年 龄和住址, 可以定义成一个结构数组。如下所示: struct { char name[8]; char sex[4]; int age; char addr[40]; }student[40]; 也可定义为: struct string { char name[8]; char sex[4]; int age; char addr[40]; }; struct string student[40]; 需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为: 结构数组元素.成员名 例如: student[0].name student[30].age