C语言程序设计7
C语言程序设计实训教程第7章 指 针

12
2)指针与一维数组 【例 7.6】 下列程序的运行结果是( )。[读 程序写结果,重庆市 2001年第 2次等级考试]
13
14
3)指向字符的指针
15
16
17
18
4)指针与二维数组
19
5)指向一维数组的指针(行指针) 【例 7.18】 对 int(﹡p)[5];的正确描述 是( )。[多选题,重庆市 2003年第 1次等级考 试] A. p是数组名 B. p是指针变量名 C. p数组中有 5个元素 D .p指向一个包含 5个元素的整型数组 E. p是一个整型数组 答案:B D
22
7)指针数组 当数组的元素类型为指针时,叫做指针数组。 【例 7.21】 下列程序的运行结果是( )。 [读程序写结果,重庆市 2004年第 2 次等级考试]
23
8)指针做函数参数 指针做函数参数的主要目的是利用在函数中, 利用指针去操作主调函数中的变量。 【例 7.22】 下列程序在数组中同时查找最大 值下标和最小值下标,并分别存放在 main函数的 变量 max和 min中,请填空。[读程序写结果,重 庆市 2003年第 2次等级考试]
10
【例 7.3】 由于指针的数据类型实际上是指定 指针所能指向对象的数据类型,所以不同数据类型 的指针变量不能相互赋值。( )[判断题,重庆市 2005年第 2次等级考试] 答案:对 分析:在某些特定情况下,可以在不同数据类 型指针之间通过强制类型转换赋值。
11
【例 7.4】 若有定义:long intj,﹡p;,则操 作 j=(long int)p;是合法操作。( )[判断题, 重庆市 2004年第 1次等级考试] 答案:对 【例 7.5】 在 C 语言中,程序
C语言程序设计第四版_谭浩强7章

➢函数的功能
return z; }
函数体
函数首部,不是语 句,行尾无分号
精选课件ppt
函数的返回值,类 型与首部定义一致14
函数的定义
关于函数类型的说明
无返回值的函数类型为void; 有返回值的函数,其类型根据返回值 类型决定;省略类型时默认为int(建议 不要省略)
精选课件ppt
15
函数的调用
int main( )
{ int max(int a[ ],int n);
int x[6],i;
for(i=0;i<=5;i++)
scanf("%d",&x[i]);
printf("max=%d",max(x,6));
return 0;
}
实参为数组名
精选课件ppt
int max(int a[ ],int n) { int m,i; m=a[0]; for (i=1;i<n;i++)
float fac; fac=1; for(i=1;i<=n;i++)
fac=fac*i; return fac;
printf("c="); scanf("%d",&c);
}
sum=factorial(a)+factorial(b)+factorial(c);
printf("%d!+%d!+%d!=%.0f",a,b,c,sum);
函数1 函数2 函数3
函数1 函数2
精选课件ppt
34
变量作用域——局部变量和全局变量
C语言程序设计实验实验报告7

C语言程序设计实验实验报告7实验名称:链表实现学生信息管理系统实验目的:通过设计链表实现学生信息管理系统,掌握链表的操作方法及其应用。
实验内容:设计一个学生信息结构体,包括学号、姓名、性别、年龄和成绩五个成员变量,并选择链式结构存储这些数据。
实现以下功能:1. 添加学生信息:从键盘输入学号、姓名、性别、年龄和成绩等信息,添加到链表中。
2. 删除学生信息:从链表中删除指定学号的学生信息。
5. 按成绩排序:按学生的成绩从高到低排序,并输出所有学生的信息。
7. 退出程序:退出学生信息管理系统。
实验方法:1. 设计学生信息结构体,定义链表节点结构体,并编写初始化链表和销毁链表的函数。
2. 编写添加学生信息函数,新建链表节点并插入链表末尾。
3. 编写删除学生信息函数,根据学号查找需要删除的节点,先将该节点从链表中删除,再释放节点空间。
4. 编写修改学生信息函数,根据学号查找需要修改的节点,并修改其成员变量。
6. 编写按成绩排序函数,使用冒泡排序法对链表进行排序,并输出所有学生的信息。
7. 编写输出所有学生信息函数,遍历链表并输出每个节点的信息。
8. 完成学生信息管理系统的主函数,实现菜单及相应功能的选择。
实验结果:依次选择菜单中的各个功能,添加、修改、删除、查找、排序和输出学生信息都能实现。
经测试,程序稳定运行,功能正常,符合需求。
本次实验主要让我们掌握了链式结构的概念、链表节点的定义、链表的初始化、插入、查找、删除和销毁链表的操作方法,以及在实际应用中如何使用链表来实现数据管理。
虽然链表操作相对于数组稍微有些繁琐,但其可以灵活处理数据结构的长度变化,具有更高的可扩展性和更好的操作效率,可以更好的适应各种实际需求。
在实验中,还需要注意节点指针的正确使用、各个函数之间的调用关系和输入输出数据格式的合理选择等问题,以保证程序能够正常运行。
同时,还需要保持认真细致的态度,严格按照实验需求和要求来完成每个步骤,以达到更好的实验效果和运行效率。
大学生C语言程序设计(第四版 谭洪强)实验7 答案

实验七 参考答案(参考答案)(1) (sy7-1.c )请编写函数fun ,它的功能是:计算并输出n (包括n )以内能被5 或9 整除的所有自然数的倒数之和。
例如,若主函数从键盘给n 输入20后,则输出为s=0.583333。
注意:n 的值要求不大于100。
算法分析:使用for 循环i ,遍历n 包含n 以内的所有整数,逐一判断每个i ,是否满足条件(能被5 或9 整除),如果满足,则把它的倒数累加到累加器里。
注意:i 的倒数要表示成:1.0/i;参考子函数如下:double fun(int n){double sum=0;int i;for(i=5;i<=n;i++)if(i%5==0||i%9==0)sum=sum+1.0/i;return sum;}(2) (sy7-2.c ) 请编写函数fun ,其功能是:根据以下公式计算s ,并计算结果作为函数值返回,n 通过形参传入。
n s ⋯++++⋯++++++=321132112111例如:若n 的值为11时,函数的值为1.83333算法分析:等式右边从第二项(i=2)开始,其分母等于前一项的分母加上i ;一共有n 项;求出每项的分母,然后把每项进行累加。
参考子函数如下:float fun(int n){float sum=1; //sum 中已经累加了第一项的值int i,m=1; //m 表示每项的分母;for(i=2;i<=n;i++){ m=m+i;sum=sum+1.0/m;}return sum;}(3) (sy7-3.c)请编写函数fun,其功能是:将两个两位数的正整数a、b 合并形成一个整数放在c 中。
合并的方式是:将 a 数的十位和个位依次放在c 数的十位和千位上,b 数的十位和个位数依次放在c 数的个位和百位上。
例如,当a=45,b=12,调用该函数后,c=5241。
算法分析:对一个两位数n,它的各位可以通过n%10求的,它的十位数可以通过n/10求的;所以分别用上述方法求的a和b的个位和十位,同时按照要求累加到c里。
二级C语言程序设计-7_真题-无答案

二级C语言程序设计-7(总分100,考试时间90分钟)一、选择题1. 构成C程序的三种基本结构是A.顺序结构、转移结构、递归结构 B.顺序结构、嵌套结构、递归结构 C.顺序结构、选择结构、循环结构 D.选择结构、循环结构、嵌套结构2. C语言编译程序的功能是A.执行一个C语言编写的源程序 B.把C源程序翻译成ASCII 码 C.把C源程序翻译成机器代码 D.把C源程序与系统提供的库函数组合成一个二进制执行文件3. 下列形式中不合法的常量是A.2.E8 B.-.28 C.-028 D.2e-84. 以下不是C语言字符型或字符串常量的是A."It's" B."0" C.'a=0' D.'\010'5. C语言程序中,若函数无返回值,则应该对函数说明的类型是A.intB.doubleC.charD.void6. 若变量已正确定义并赋值,则错误的赋值语句是A.a+=a+1;B.a=sizeof(double);C.a=d‖c;D.a+1=a;7. 若有定义:int a=1,b=2,c=3;,则执行表达式(a=b+c)‖(++b)后a,b,c的值依次为A.1,2,3 B.5,3,2 C.5,2,3 D.5,3,38. 有以下程序#include <stdio.h>main(){ int k=10;printf("%4d, %o, %x\n", k, k, k);}程序的运行结果是(□代表一个空格)A.10,12,a B.□□10,012,a C.010,12,a D.□□10,12,a9. 设有:char s[5], c;,则调用函数scanf能正确给s和c读入数据的是A.scanf("%s%c", s,c); B.scanf("%d%c", &s, &c); C.scanf("%d%c", s, &c); D.scanf("%s%c", s, &c);10. 设x,y,z均为实型变量,代数式在C语言中的正确写法是A.x/y*zB.x%y%zC.x/y/zD.x*z/y11. 有以下程序#include<stdio.h>main(){ int i, j, k, a=5, b=6;i=(a==b)?++a: --b;j=a++; k=b; printf("%d, %d, %d\n", i, j, k);}程序的运行结果是A.7,6,5 B.5,5,5 C.7,5,5 D.5,6,512. 设变量x为long int型并已正确赋值,以下表达式中能将x的百位上的数字提取出的是A.x/10%100B.x%10/100C.x%100/10D.x/100%1013. 有以下程序#include<stdio.h>main(){ int i, j, x=0;for(i=0; i<2; i++){ x++;for(j=0; j<=3; j++){if(j%2==0) continue; x++; }x++;}printf("x=%d\n", x);}程序的运行结果是A.x=4 B.x=6 C.x=8 D.x=1214. 有以下程序#include<stdio.h>main(){ int sum=0, x=5;do{sum+=x; }while(!--x);printf("%d\n", sum);程序的运行结果是A.0 B.5 C.14 D.1515. 有以下程序#include<stdio.h>main(){ char ch='Z';ch=(ch-'A'+1)%26+'A'; putchar(ch);程序的运行结果是A.Z B.Y C.B D.A16. 以下函数的功能是:计算a的n次方作为函数值返回double fun(double a, int n){ int i; double s=1.0;for(i=1; i<=n; i++) s=______;return 8;}为实现上述功能,函数中下划线处应填入的是A.s*i B.s*a C.s+i*i D.s+a*a17. 在C语言程序中,下列说法正确的是A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和调用均不可以嵌套 D.函数的定义和调用均可以嵌套18. 若主函数中有定义语句:int a[10],b[10],c;,在主函数前定义的fun函数首部为:void fun(int x[]),则以下选项中错误的调用语句是A.fun(b); B.fun(&c); C.fun(&a[3]); D.fun(b[1]);19. 有以下程序#include<stdio.h>main(){int k, n=0; char c, str[]="teach";for(k=0; str[k]; k++){ c=str[k];switch(k){case 1: case 3: case 5: putchar(c); printf("%d", ++n); break;default: putchar('N');}}}程序的运行结果是A.Ne1NN B.e1a2e3 C.Ne1Nc2N D.Na1NNNN20. 以下叙述中错误的是A.同一个数组中所有元素的类型相同 B.不可以跳过前面的数组元素,给后面的元素赋初值 C.定义语句:int a[10]={0};,给a数组中所有元素赋初值0 D.若有定义语句:int a[4]={1, 2, 3, 4, 5};,编译时将忽略多余的初值21. 执行以下程序段后,s的值为int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9}, s=0, k;for(k=0; k<8; k+=2) s+=*(a+k);A.13 B.16 C.17 D.4522. 有以下程序#include<stdio.h>#define N 4void fun(int a[][N], int b[]){ int i;for(i=0; i<N; i++) b[i]=a[i][N-1-i];}main(){ int x[N][N]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, y[N], i;fan(x, y);for(i=0; i<N; i++) printf(:%d,", y[i]);printf("\n");}程序的运行结果是A.1,2,3,4, B.3,6,9,12, C.4,7,10,13, D.1,5,9,13,23. 有以下程序#include <stdio.h>#include<string.h>main(){char str[]={"Hello, Beijing"};printf("%d, %d\n", strlen(str), sizeof(str));}程序的运行结果是A.13,13 B.13,14 C.13,15D.14,1524. 有以下程序#include<stdio.h>void fun(char(*p)[6]){ int i;for(i=0; i<4; i++) prinff("%c", p[i][i]);printf("\n");}main(){ char s[6][6]={"ABCDE", "abcde", "12345", "FGHIJ", "fghij", "54321"};fun(s);}程序的运行结果是A.A a 1 F B.A b 3 I C.A B C D D.f g h i j25. 有以下程序#include<stdio.h>int fun(int n){ if(n) return fun(n-1)+n;else return 0;}main(){printf("%d\n", fun(3)); }程序的运行结果是A.4 B.5 C.6 D.726. 有以下程序#include<stdio.h>#define M 5#define f(x, y) x*y+Mmain(){ int k;k=f(2, 3)*f(2, 3);printf("%d\n", k);}程序的运行结果是A.22 B.41 C.100 D.12127. 有以下定义struet data{ int i; char c; double d; } x;以下叙述中错误的是A.x的内存地址与x.i的内存地址相同 B.struct data是一个类型名 C.初始化时,可以对x的所有成员同时赋初值 D.成员i、c和d占用的是同一个存储空间28. 有以下程序#include <stdio.h>#include<string.h>typedef struet{ char name[9]; char sex; float score[2]; }STU;void f(STU *a){ strcpy(a->name, "Zhao");a->sex='m'; a->score[1]=90.0;main(){ STU c={"Qian", 'f', 95.0, 92.0}, *d=&c;f(d); printf("%s, %c, %2.0f, %2.0f\n", d->name, c.sex, c.seore[0], c.score[1]);}程序的运行结果是A.Qian,f,95,92 B.Zhao,f,95,90 C.Zhao,m,95,90 D.Zhao,f,95,9229. 若有以下定义struet tt{char name[10]; char sex; } aa={"aaaa", 'F'}, *p=&aa;则错误的语句是 A.scanf("%c", aa.sex); B.aa.sex=getchar(); C.printf("%c\n", (*p).sex); D.printf("%c\n", p->sex);30. 若有说明:typedef struet {int a; char c; }W;则以下叙述正确的是A.编译后系统为W分配5个字节 B.编译后系统为W分配6个字节 C.编译后系统为W分配8个字节 D.编译后系统不为W分配存储空间二、程序填空题1. 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
电大C语言程序设计 第7章 结构和联合

第7章 结构和联合 章 7.3 结构成员的访问 1.访问结构成员:通过点操作符“.”进行。 访问结构成员: 进行。 访问结构成员 通过点操作符“ 进行 访问code成员 例:person.code//访问 访问 成员 person.salary//访问 访问salary成员 访问 成员 2. 同类型的结构变量可相互赋值。 同类型的结构变量可相互赋值。 struct person { char name[20]; unsigned long id; float salary; }; person pr1={“Frank voltaire”,12345678,3.35}; person pr2; pr2=pr1; //同类型的结构变量可相互赋值 同类型的结构变量可相互赋值
第7章 结构和联合 章 7.2 结构变量的定义和初始化 结构变量定义方法有三种。 结构变量定义方法有三种。 1. 先定义结构类型,再定义变量 先定义结构类型, struct Arith { char op; int a,b; }; int xx=40; (1)struct Arith x,y; (2)struct Arith z1={'+',10,xx},z2={'*',60},z3=z1; (3)struct Arith *d=&z1; (4)struct Arith a[4]={{'+',3,7},{'-',10,5},{'*',6,4}, {'/',8,5}}; (5)struct Arith *b[ ]={&z1,&z2,a+2,&a[3]};
struct D{ int * a; int * ap; int maxsize; }; struct E{ int d,* e; struct B b; }; struct F{ double data; struct F * next; };
C语言程序设计(向华主编)_第7章_函数

fun1_2() {…… }
fun2() { …… fun2_1(); …… fun2_2(); …… }
fun2_1() {…… }
fun2_2() {…… }
《C语言程序设计》 语言程序设计》
清华大学出版社
第7章
函数
7.1
二、C 二、C函数的分类
1.从函数定义的角度分类 从函数定义的角度分类
函数概述
《C语言程序设计》 语言程序设计》
清华大学出版社
第7章
函数
习题
P187 3.(1)(2)(3)
《C语言程序设计》 语言程序设计》
清华大学出版社
第7章
函数
7.3
一、函数参数
函数参数及返回值
参数的作用: 参数的作用: 函数的参数用于建立函数之间的数据联系。当一个函数调用另一个函数时, 实际参数的值会传递给形式参数,以实现主调函数与被调函数之间的数据通 信。同时,函数参数的运用还可提高一个函数的灵活性和通用性。 [例7.3] 编写一个函数,打印一条由星号构成的横线。 例 编写一个函数,打印一条由星号构成的横线。 main() { pstar() ; /* 第一次调用pstar函数 */ printf(" 欢迎使用本程序!\n") ; 运行结果: 运行结果: pstar() ; /* 第二次调用pstar函数 */ ******************** } 欢迎使用本程序! pstar() /* 定义pstar函数 */ ******************** { printf("********************\n") ; }
《C语言程序设计》 语言程序设计》
清华大学出版社
第7章
c语言程序设计课后习题答案第7章

#include<stdio.h>main(){int a[10],n,sum=0,i;float ave;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);sum=sum+a[i];}ave=1.0*sum/n;printf("ave=%.2f\n",ave);}/*练习7-2*/#include<stdio.h>main(){int a[10],n,i;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){printf("第%d个:\n",i+1);scanf("%d",&a[i]);printf("倒序:\n");while(a[i]!=0){printf("%d",a[i]%10);a[i]=a[i]/10;}printf("\n");}}#include<stdio.h>main(){int a[5],x,i,k=0;printf("enter 5 ge zheng shu:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);printf("enter x:\n");scanf("%d",&x);for(i=0;i<5;i++)if(a[i]==x){printf("xia biao wei : %d\n",i);k=1;}if(k==0)printf("Not Found\n");}/*练习7-4*/#include<stdio.h>main(){int a[10],n,i,k=0,x,max;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<=n-1;i++)if(max<a[i]){max=a[i];k=i;}printf("max=%d xia biao=%d",max,k);x=a[n-1];a[n-1]=a[k];a[k]=x;printf("\n");for(i=0;i<n;i++)printf(" %d ",a[i]);printf("\n");}/*练习7-11*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;str[i]='\0';printf("再输入一个字符:\n");str[80]=getchar();for(j=0;j<=i-1;j++)if(str[80]==str[j])count++;printf("%c字符在字符串中出现的次数为:%d\n",str[80],count);for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}/*习题七1*/#include<stdio.h>main(){int x,y,n,a[10],i,min,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);min=0;for(i=1;i<n;i++)if(a[min]>a[i])min=i;max=0;for(i=1;i<n;i++)if(a[max]<a[i])max=i;x=a[min];a[min]=a[0];a[0]=x;y=a[max];a[max]=a[n-1];a[n-1]=y;for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七2*/#include<stdio.h>main(){int x,n,a[10],i,j,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++){ max=i-1;for(j=i;j<n;j++)if(a[max]<a[j])max=j;x=a[max];a[max]=a[i-1];a[i-1]=x;}for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七4*/#include<stdio.h>main(){int m,n,a[6][6],i,j,b[6]={0};printf("输入m:\n");scanf("%d",&m);printf("输入n:\n");scanf("%d",&n);printf("输入%d和%d的矩阵:\n",m,n);for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);b[i]=b[i]+a[i][j];}}printf("shu chu:\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf(" %d",a[i][j]);printf("\n");}printf("shu chu hang he :\n");for(i=0;i<m;i++)printf("%4d",b[i]);printf("\n");}/*习题7.6*/#include<stdio.h>main(){char str[80];int i,j;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("倒序输出:\n");for(j=i-1;j>=0;j--)putchar(str[j]);printf("\n");}/*新7.6*/#include<stdio.h>main(){int a[10],i,n;printf("输入整数n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);}printf("倒序输出:\n");for(i=0;i<n;i++){printf("%5d",a[n-1-i]);}printf("\n");}/*习题7.7*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出其中的大写辅音字母:\n");for(j=0;j<=i-1;j++)if(str[j]>='B'&&str[j]<='Z'&&str[j]!='E'&&str[j]!='I'&&str[j]!='O'&&str[j]!='U'){putchar(str[j]);count++;}printf("\n");printf("大写辅音字母数量为:%d\n",count);}/*习题7.8*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出相应交换后的字符串:\n");for(j=0;j<=i-1;j++)if(str[j]>='A'&&str[j]<='Z')str[j]=155-str[j];for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}上文已完。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char tel[12c]h; ar、float、double等)一样具有同样的地
};
位和作用,都可以用分来号定不义可变少量的类型。
定义一个结构体类型的一般形式为:
struct 结构体名 { 成员表列 };
说明: (1)struct为结构体类型说明的关键字,是结构体类型定义的标识符。 (2)结构体名由用户定义,它与struct一起形成特定的结构体类型, 在以后的结构体变量定义中可以被使用。 (3)成员列表为本结构体类型所包含的若干个成员的列表,必需用{ } 括起来,并以分号结束。每个成员的形式为
222
B
s
str{u22c2t,s'Btu',d'se'}n,t aatd[10]={{“zhan3g08ming”,18,’Pm’},{“Lipiabng”,20,’f’}};
{308,'P','b'}
s}t;ruct student aatd[]={{“zhang ming”,18,’m’},{“Lipiang”,20,’f’}};
}stu; }stu;
2.结构体变量初始化
定义结构体变量后,就可给变量中的各个成员初始化。其初始化形式 如: struct stu {int num; char name[8]; char sex; float score; } p={1001,"Lili",'F',99.5};
3.结构体成员的引用
用无名结构体直接定义 变量只能一次
1.结构体变量的定义
– 说明
结构体类型与结构体变量概念不同
– 类型:不分配内存;
变量:分配内存
例{str例iuii{nnnctsttt结结timcdynr–dhe构构autoaaa类ycntrrn体体;tet型;unhs可成ma;:t不um;嵌 员d能ee[套名赋n2t0值与];、程存序取中、变运算量;名可变相量:同可以,不会混淆
共用体:其中所有成员均放在以同一地址开始的存储空间 中,使用 “共享”和“覆盖”的方式共享存储单元。共用体所 占的空间的大小取决于占存储空间最大的那个成员。
共用体类型的定义
union [共用体类型名] { 类型名 成员名; …… };
union u { char ch;
int i; float f; };
形式二 定义结构体类型的同时定义结构体变量
成员名;
类型标识符 成员名;
例 struct student
……………. }变量名表列;
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
图 7-1
7.1.1 结构体类型的定义
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数 据类型
– 结构体类型定义:
struct是关键字, 不能省略
struct [结构体名]
{ 类型标识符 成员名; 类型标识符 成员名;
……………. };
合法标识符 可省:无名结构体
第7章
结构体、共用体与枚举
第7章 结构体、共用体与枚举
本章学习C语言的三种数据类型,分别是构造类型中的结 构体和共用体类型,以及基本类型中枚举类型。
本章先给出结构体类型的定义,着重讲述结构体变量的定 义、引用、初始化,结构体数组及结构体的应用;然后讲述共 用体和枚举类型;同时介绍动态分配内存的函数和typedef语 句。
int month;
int day; }; struct stu
date
name
sex score
year month day
{
char name[20];
struct birthday date;
char sex;
float score;
};
7.1.2 结构体变量
有了结构体类型,它仅相当于一个模型,但其中并无具体 数据,系统对它不分配实际内存单元,为了能在程序中使用结 构休类型的数据,就须在此类型基础上定义变量。结构体类型 变量因其所基于的类型是自定义的,故有三种形式的定义方法, 分别是:
形式一 先定义结构体类型,再定义结构体变量
1.结构体变量的定义
struct 结构体名
{
类型标识符 成员名;
例 struct student { int num;
例类型#d标e识fin符e S成T员U名D;ENT struct student }; …S…T…U…D…EN. T struct 结{ 构体i名nt n变u量m名; 表列;
int i;
printf("number color type\n");
for(i=0;i<5;i++)
printf("%-9d%-c\n",car[i].num,car[i].color,car[i].type);}
7.2 共用体
7.2.1 共用体类型的定义 7.2.2 共用体变量
7.2.1 共用体类型的定义
方式。如结构体类型既可以定义结构体变量,也可以定义结构 体数组,用以存储批量的数据,每个结构体数组元素又包含多 个成员。
1.结构体数组的定义
形式二一三:: stsrtuructctstsutuddenent t
{ int num; char name[20]; char sex; int age;
() ()
}stu}1s,tsutu12,s;tu2;
7.1.3 结构体数组
结构体数组的定义 结构体数组的初始化 结构体数组的应用
1.结构体数组的定义
结构体类型既可以定义结构体变量,也可以定义结构体数组,用
以存储批量的数据,每个结构体数组元素又包含多个成员。结
构体数组中的各元素在内存中是连续存放的。 定义结构体数组的方法和定义结构体变量的方法相同,也有三种
字符型 char 实型 float 双精度型 Double 空值型 void
共用体(联合)型 union
指针类型
枚举型
enum
用户定义类型 构造数据类型(导出类 typedef 型):由基本数据类型 按一定规则组合而成的 。广义上包括表中的构 造类型和派生类型。
7.1 结构体
如我们可以规定学号(num)为字符型数组、姓名(name)为
};
m{ 2asti.nat(结i)c st构ruc体t s c数ar[]组={ 的初始n化umber
color
type
{{s12t01r10u,,''cGYt ''结,,''mc'构}'}, , 体名
101
G
c
数组名[元素210个数]={{…Y },{…},…,m{…}};
105
R
l
{105,'R','l'},
}s; tu[2]; struct student stu[2];
num 29B name
sex age num name sex age
stu[0] stu[1]
2.结构体数组的初始化
struct s
{
cih1nat.rn结cuomlo构;r; 体数组的定义
cshtarrutcytp结e;构体类型名 结构体数组名[元素个数];
定这样一种包含若干个类型不同(当然也可以相同)的数据项的
数据结构,它称为结构体(structure)。组成结构体的数据项成
为结构体成员。在其他高级语言中称其为“记录”。
num
name
sex birthday
score
tel
04010538
Liu li hua
F
83/05/28
78
90.5 85583173
第7章 结构体、共用体与枚举
7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 类型的重新命名
7.1 结构体
7.1.1 结构体类型的定义 7.1.2 结构体类型变量 7.1.3 结构体数组
类型不同但相 基本互类型关联
整型 int
构造类型
结构体 struct
派生类型 数组类型
同一类型 数据的顺 序排列
类型标识符 成员名;
7.1.1 结构体类型的定义
【(4例)7整.1个】结构结体构类体型类的型定的义用嵌分套号。结束,花括号后边的分号不能缺省。
s(t5r)uc结t 构b体ir中th的d成ay员本身还可以是结构体,这称为结构体的嵌套。而且
{内嵌结构体成员的名字可以和外层成员名字相同。 int year;
对结构体的变量不能整体引用,必须逐级地访问到成员名。其引用形 式为:
结构体变量名.成员名
其中,圆点符号称为成员运算符。
3.结构体成员的引用
– 引用方式: 结构体变量名.成员名
例 例
s{}s{ttsrrtu例uuc{c1可结tt,iccifcisccifcsn{}nnnllthhhhhhicst以构oorsbtstntuttaaahaaautatarinta2naurrrurrracut将体tgiiiug;utdrdsatsacnnnnsshnenmemeeededctnctttu一嵌d;a;saxn例xnododa;mmdy;tammd;t;turrmrr个套aeya[ee[;odeeya3;3例t;e;n[e[re;结 时00[22;ts{}n2]h]0t0st;;0r构逐;t]]u]u;;s{};c1t体级str,ticcifcusunnlhhh变引tco1sttsu成 优 结aaattat,niaccifc2uurrrs量用tnnl员 先 合ghhhsu1;tdosasttstu=nseaaamueedtapc赋(级 性na2t{;urrra2nxn分rtuod;g1u;i=umdsa;tns::1rr0值nemms从e量ede[ct1.1et;fa3xnbu;od(,;[左m)给““01;ti2rr运Wr%;e[]0et向3;;另h算ad[]n0n2;d,右a(%]符m0一aL;sy]ie,;n.%个m”) ,cm‘os结,Ms%tontuun’dt1s构s,1tht1,.thu%s.u=9ac1体1g,fo1i….8.,fesnbr%27(c+e变uis….d;or++5stmtaur\=h,;en.y量“1=.ds=”D=t1a,8u=sa0y25tLs;u..t5siy1uac;e)2(no;a)”rr)e};;