C程序设计第10章
C语言程序设计_谭浩强_第二版_CH10

}
第十章 指针 10.3 数组的指针和指向数组的指针变量 10.3.2 通过指针引用数组元素 例10.5输出数组中的全部元素。 ②通过数组名计算数组中元素的地址,找出元素的值。
main() {
int a[10],i; for(i=0;i<10;i++){scanf(“%d”,&a[i]);} print(“\n”); for(i=0;i<10;i++){printf(“%d”,*(a+i));} print(“\n”);
}
运行结果为: 100,10 100,10
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.1 通过指针变量访问整型变量
pointer_1 &a
a 100 *pointer_1
pointer_2 &b
b 10 *pointer_2
第十章 指针 10.2 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 5 *pointer_1
pointer_2 &b
b 9 *pointer_2
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
b 5 *pointer_2
&b
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 9 *pointer_1
《C语言程序设计》教材习题答案第10章

一、选择题1. 设已定义“int a,* p”,下列赋值表达式中正确的是:C)p=&a2. 设已定义“int x,*p=&x;”,则下列表达式中错误的是:B)&*x3. 若已定义“int a=1 ,*b=&a;”,则“printf(“%d \n”,*b);”的输出结果为:A)a的值。
4. 设已定义“int x,*p,*pl=&x,*p2=&x;”,则下列表达式中错误的是:C)p=p1+p2.5. 设有函数定义“void p(int *x){printf(“%d\n”,*x);}”和变量定义“int a=3;”,则正确的函数调用是:C)p(&a)6. 函数“int fun(char * x){char * y=x; while(*y)y++;return(y-x); }”的功能是A)求字符串的长度。
7. 运行一下程序,输出结果为:B)5 6int fun (int a,int *b){a++;(*b)++;return a+*b;}void main(){int x=1,y=2;Printf(“%d”,fun(x,&y));Printf(“%d”,fun(x,&y));}8. 运行以下程序,输出结果为:C)58#include<stdio.h>Int * fun(int a ,int *b){a++;(*b)++;*b=a+*b;return b;}Void main(){Int x=1,y=2,*z;Z=fun(x,&y);Printf(“%d”,*z);Z=fun(x,&y);Printf(“%d”,*z);}9. 若已定义“int a[]={1,2 ,3,4},*p=a;”,则下面表达式中值不等于2的是C)*(++a)10. 若已定义“int a[]={1,2 ,3,4},*p=a+1;”,则p[2]的值为C)411. 设已定义“int x[4][10],*p=x[0];”,则下列表达式中的值为整形的是B)*(p+1)12. 设已定义“char s[]=”ABCD”;”,”printf(“%s”,s+1)”的值为C)BCD13. 设已定义“char str[]=”abcd”,*ptr=str;”,则*(prt+4)的值为B)014. 下面对字符串变量的初始化或赋值操作中,错误的是C)char a[10];a=”OK”;15. 设已定义“char *ps[2]={“abc”,”1234”};”,则以下叙述中错误的是A)ps为指针变量,它指向一个长度为2的字符串数组16. 设已定义“struct {int a,b;} s,*ps=&s;”,则错误的结构体成员引用是C)*ps.a17. 设已有以下定义,则表达式的值为2的是A)k=++p->datastruct st {int data;st *link;} a[3]={1,a+1,3,a+2,5,0},*p=a;二、编程题1. 输入3个字符串,输出其中最大的字符串(用字符指针)#include <stdio.h>#include <stdlib.h>#define str_count 3#define str_length 100int main(int argc, char *argv[]){char a[str_count][str_length],*p;printf("请输入3个字符串:");int i;for(i=0;i<str_count;i++){scanf("%s",a[i]);}p=a[0];for(i=1;i<str_count;i++){if(strcmp(p,a[i])<0){p=a[i];}}printf("最大的字符串为:%s",p);system("PAUSE");return 0;}2. 定义一个函数,函数的功能是求已知半径的圆的周长和面积。
C--程序设计--第10章-多态性及虚函数

使用重载函数注意:
不要使用重载函数描述不相干的函数 在类中,构造函数和普通成员函数均可以
重载 避免与函数的默认参数产生二义性
二、运算符重载
运算符重载(operate overloading)就是 赋予已有的运算符多重含义。
运算符重载实质是函数重载,运算符重载 的选择与函数重载类似,会根据运算符的 操作数的类型、个数和顺序来进行运算符 函数的选择。
#include<iostream.h> str#iinngc:l:usdter<isntgr(icnhga.rh>*s) v{}ossccsssc{s{{ittohtttolsstlsssls*drruarrrueptrepttepsi1trii3tc{pn=rin=rrn=pmn.<nn.<lprgncngncign=agp<*ggp<auitepgtepnte'irssrssbv\hwy:hwyghwnsit1ssitsla0=(:=(:=(tnr=ttnrit'scssscs:sc)rt1"rrt3scesss~ivci;thpt1hpsih1(.T23(.t::tttsnohn}ra,r.a,tza()gh(()grrrrttiatlrsilrsrer";eass;eiiiirdre[)ne[1i;[Ttt1ttnnnniglnl;gnl.nlhl)rlggggnep*e(e}(gesgeiei;2e(((gtrsnsnstnp(nsns)ncsi(lipg)gthg)ig(;(htn)en;t;tr;t;nti)a)artnthhih}ths<<ri{((;+n++<p<snd))}1g1s1aere*ige;]]i]nonszl{{;&;z;ddgd)&eercseelrl;s=teo1)m;a;/18etu)om/)0ut..;)构sr<""/;pn<造);//;s;/复}lp函构e<制n<数造ge构tn函hd造;l数};重} 载
c程序设计教程与实验课后答案

c程序设计教程与实验课后答案【篇一:c程序设计教程与实验第10章习题参考答案】题1.二进制文本2.rewind()3.字节流式4.”abc.dat” “rb”5.06.将文件位置指针从文本末尾处向文件头的方向移动10个字节7.将文件file1.txt的内容输出到屏幕8.将f1的字符保存到f2中9.rfetc(fp)num++10.fopen(“file.dat”,”wb”)dt,1,9,fp三、程序分析题1. 242.复制f1到f23.1.14.1177995. 65a 66b 67c 68d 69e 70f 71g 72h 75k 76l 77m 78n 79o 80p 81q 82r 85u 86v 87w 88x 89y 90z四、编程题1.#includestdio.h#includestdlib.hint main(){char file[10],file1[10],ch;file *in,*out;scanf(%s,file);scanf(%s,file1);if((in=fopen(file,r))==null){printf(cant open file\n);exit(0);}if((out=fopen(file1,w))==null) 73i 74j 83s 84t {printf(cant open file1\n);exit(0);}while(!feof(in)){ch=fgetc(in);fputc(ch,out);putchar(ch);}fclose(in);fclose(out);return 0;}2.#include stdio.h#includestring.h#include errno.hint main(void){file *fp;char ch;if (null == (fp = fopen(g3, r))){printf(fopen g3 error: %s\n, strerror(errno)); return 0;}while ((ch = fgetc(fp))!=eof){printf(%c, ch); }fclose(fp);printf(\n);return 0;}3.#includestdio.hvoid main(){file *fp; /*定义一个文件指针*/int i;double a[10];if((fp=fopen(data.txt,wb+))==null){printf(file can not open,press any key to exit!\n); getch(); /*从键盘上任意输入一字符,结束程序*/exit(1);}for(i=0;i10;i++)scanf(%lf,a[i]);for(i=0;i10;i++)fwrite(a+i,sizeof(double),1,fp);printf(\n);rewind(fp);fread(a,sizeof(double),10,fp);for(i=0;i10;i++)printf(%f\n,a[i]);printf(\n);fclose(fp);}4.#includestdio.hvoid main(){file *fp;int a[80],i,j;int a,b,c;a=b=c=0;if(fp=fopen(g4.dat,r))==null)printf(读取失败\n);for(i=0;i80;i++){fscanf(fp,%d,a[i]);if(fp==eof)break;}for(j=0;j=i;j++){if(a[i]0) a++;if(a[i]0) b++;if(a[i]==0) c++;}printf(正=%d,负=%d,零=%d\n,a,b,c);5.#includestdio.hstruct student{char num[10];char name[8];int score[2];float ave;} stu[3];void main(){int i,j,sum;file *fp;for(i=0;i3;i++){printf(\ninput score of student %d:\n,i+1);printf(no.:);scanf(%s,stu[i].num);printf(name:);scanf(%s,stu[i].name);sum=0;for(j=0;j2;j++){printf(score %d:,j+1);scanf(%d,stu[i].score[j]);sum+=stu[i].score[j];}stu[i].ave=sum/2.0;}fp=fopen(stud,w);for(i=0;i3;i++)if(fwrite(stu[i],sizeof(struct student),1,fp)!=1) printf(file write error\n);fclose(fp);fp=fopen(stud,r);for(i=0;i3;i++){fread(stu[i],sizeof(struct student),1,fp);printf(\n%s,%s,%d,%d,%d,%6.2f\n,stu[i].num,stu[i].name,stu[i]. score[0], stu[i].score[1],stu[i].score[2],stu[i].ave);}}【篇二:c语言程序设计实训教程习题和实验解答】ss=txt>2.1 c语言概述【习题解答】1结构化程序有三大基本结构:顺序、分支和循环.2..算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。
C语言程序设计第10章xg

{ in学t 号a;ge ;
是构姓名造;数据类若型被)处进理行对描象述是一的个。游戏玩
f性lo别at ;ห้องสมุดไป่ตู้core ; 家,则此结构体类型的名称
} ;年龄;
和内部格式可以这样描述:
成绩;
结构体 玩家 { 姓名;
分数; };
};
10.1 结构体类型的声明
声例s声tr如明u明c,一t结格s前t般构u式言d情体e如提n况类t下到下型的:,结时构使,体用需名结要为构注st体意ud编e以nt写下的程几结序构点体时:类,型结,构如体下类: 型的 ❖{sti以rnut 分cntu号m结结;构束体(名指的是上例中右大括号“}”后面的 分{c号h数ar)据n,a类m且型e[该10结分] ; 构号体必成不员可1少;。 ❖c结h数a构r据s体e类x类型; 型结的构声体明成当员作2一;个语句来处理。类型内部 使in用…t a若…ge干; 个独立的语句对每个成员进行声明。 }fl;oat score ; ❖} ;在接其下中来str的uc程t是序声设明计结中构,体就类可型以的使关用键此字结,构结体构类体型名( 对tag结-n构am体e)变由量程进序行员定自义己了命。名,如student。而“struct 结 构体名”才是所声明的结构体类型名。
第10章 结构体与共用体
学习内容指南
10.1 结构体类型的声明 10.2 结构体变量的定义、初始化和引用 10.3 结构体数组 10.4 指向结构体变量的指针 10.5 动态单链表
10.6 共用体
前言
例: 学生信息表
“结这构里体学要学号注生意”姓类,型名一可定描要性述弄别如清下:结年 构龄 体类成 型绩 与结构体变量的
10.1 结构体类型的声明
C语言程序设计第10章文件及其应用

学一学
1.定义文件指针 一般形式为: FILE * fp; 其中fp就是所定义文件指针。 FILE类型 以及所有的文件读写函数和相关常量都定 义在文件stdio.h中,在源程序的开头要 包含头文件 stdio.h 。
学一学
2.打开文件 C语言中,使用fopen函数来打开文件。打开文件是使 一个文件指针变量指向被打开文件的结构变量,以便通 过该指针变量访问打开的文件。fopen函数的调用形式 如下: fopen(chFileName,mode); 以mode 方式打开文件chFileName。其中,参数 chFileName 是将要读写文件的文件名,mode为文件 的操作方式。若文件打开成功,返回一个文件指针,若 打开失败,则返回空值NULL,NULL在stdio.h中被定 义为0。文件操作方式mode是一个整数,其取值及含 义如表10-1所示。
流程图
开始 定义文件指针fp,定义整型数组 iArray[5],定义循环变量i 以写二进制文件方式打开文件 fp=fopen("test.dat","wb") N i=0
fp==NULL Y
i<5 Y 输入1个整数存入 数组元素iArray[i]
N
i++
把数组iArray中5 个整数写入文件
显示出错信息 关闭文件 exit(0)
试一试
问题10.1编一程序从键盘输入一串字符“may friendship forever! ”,然后保存在文件myInfo.txt中。 【解题步骤】 1.定义文件指针fp; 2.定义字符数组chInfo用来存输入的字符串; 3.以写文本文件方式打开文件myInfo.txt; 4.如果打开文件失败,则输出错误信息并结束程序; 5.否则,打开文件成功,则从键盘输入数据; 5.将字符数组chInfo中的字符写入文件myInfo.txt; 6.关闭文件。
C_C++程序设计与上机指导010

格式化读写函数(fprintf (fprintf和 10.3.4 格式化读写函数(fprintf和fscanf)
fprintf和fscanf函数与 和 函数与printf和scanf函数的 函数与 和 函数的 功能相似。二者的区别仅在于读写对象不同。 功能相似。二者的区别仅在于读写对象不同。 printf和scanf函数的读写对象是键盘和显示器; 函数的读写对象是键盘和显示器; 和 函数的读写对象是键盘和显示器 函数的读写对象是磁盘文件。 而fscanf 和fprintf函数的读写对象是磁盘文件。 函数的读写对象是磁盘文件
1. 数据块读函数 数据块读函数fread()
函数功能:读指定文件中的数据块 函数形式:fread(buffer,size,count,fp); • 其中: • buffer:指针,指示读入文件数据的首地址。 • size:表示一个数据块的字节数。 • count:表示要读入多少个size字节的数据块。 • fp:文件指针
• • • • • • • • • • • typedef struct{ short level; unsigned char fd; unsigned char short bsize; unsigned char unsigned char unsigned short token; }FILE; /*缓冲区满或空的程度*/ flags; /*文件状态标志*/ /*文件名*/ fold; /*如无缓冲区,则不读取字符*/ /*缓冲区大小*/ *buffer; /*数据缓冲区位置*/ *curp /*当前位置指针*/ istemp; /*临时文件指示器*/ /*用于有效性检验*/
2. 字符串读函数 字符串读函数fgets
函数功能:从指定的文件中读一个字符串到字符数组中。 函数形式:fgets(字符数组名,n,文件指针); 其中:n是一个正整数,指定读出的字符串长度。读入n-1个字符 并在最后一个字符后加一个字符串结束标志&块读写函数(fread (fread和 10.3.3 数据块读写函数(fread和fwrite)
第10章 文 件

龙诚数码:
2012-4-20
10.1 文件的概述
10.1.2 文件的打开与关闭 1. 文件打开函数fopen( ) 文件打开函数fopen(
12
常用的调用形式: 常用的调用形式: 调用形式 fp; FILE *fp; fopen(文件名 文件使用方式) 文件名, fp = fopen(文件名, 文件使用方式); 文件名:需要打开的文件名称(字符串) 文件名:需要打开的文件名称(字符串)。 文件使用方式:是具有特定含义的符号 符号。 文件使用方式:是具有特定含义的符号。 函数功能: 函数功能:
龙诚数码:
5
2012-4-20
10.1 文件的概述
10.1.1 文件和文件指针 2. 文件的种类 例如将整数1949分别存储在这两种数据文件中。 1949分别存储在这两种数据文件中 例如将整数1949分别存储在这两种数据文件中。 ASCII文件:ASCII码 文件: 文件 码
龙诚数码:
7
2012-4-20
10.1 文件的概述
10.1.1 文件和文件指针 3. 缓冲文件和文件指针
系统对文件的处理过程就是 对文件进行输入 输出操作的过 输入/ 对文件进行 输入 / 输出 操作的过 程。 从文件读数据时, 从文件读数据时,先一次性 从磁盘文件中读取一批数据到 缓冲区, 缓冲区 , 然后再从缓冲区逐个 将数据送入变量。 将数据送入变量。 向文件写数据时, 向文件写数据时,也是先将 变量中数据送到缓冲区, 变量中数据送到缓冲区 , 待缓 冲区装满后 , 再一起存到磁盘 文件中。 文件中。
按指定的文件使用方式打开指定的文件 按指定的文件使用方式打开指定的文件。 文件使用方式打开指定的文件。 若文件打开成功 成功, 若文件打开成功,为该文件分配一个文件缓冲区和一个 FILE类型变量 返回一个FILE类型指针 类型变量, FILE类型指针; FILE类型变量,返回一个FILE类型指针; 若文件打开失败 返回NULL 失败, NULL。 若文件打开失败,返回NULL。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2000 2002
2004 2006 2008 200A 200C 200E 2010
(main)
5 9 2000 2002
(swap)
整型a 整型b pointer_1
pointer_2
整型x 整型b 整型t
9 5 9 5 5
...
例 将数从大到小输出 swap(int *p1, int *p2) { int *p; 2000 p=p1; 2002 p1=p2; p2=p; 2004 地址传递 } 2006 main() 2008 COPY { int a,b; 200A int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b) swap(pointer_1,pointer_2); printf("%d,%d",*pointer_1,*pointer_2); }
(main) …...
5 9
(swap)
变量a 变量b 变量x
5 9 5 9 5
…...
变量y
变量temp
指针变量作为函数参数——地址传递
特点:共享内存,“双向”传递 例 将数从大到小输出 swap(int x,int y) 2000 { int temp; 2002 temp=x; 2004 x=y; 2006 y=temp; 2008 值传递
(main)
…...
5 9
变量a 变量b
} main() { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(a,b); printf("\n%d,%d\n",a,b); 运行结果:5, 9 }
200A
…...
例 将数从大到小输出 swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } main() COPY { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
…...
例
k=i; k=*i_pointer;
…...
--直接访问 --间接访问
2000 2001
2002 2003 2004 2005 2000
整型变量i 整型变量k
10
10
变量i_pointer 指针变量
2006
…...
§10.2 指针变量
指针变量与其所指向的变量之间的关系
i_pointer
2000 变量i 3 *i_pointer
i &i
i=3;
*i_pointer i_pointer
*i_pointer=3
指针变量的定义
一般形式: [存储类型] 例 数据类型 *指针名; int *p1,*p2; 表示定义指针变量 float *q ; 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 不是‘ * ’运算符 static char *name; 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
变量的内容
变量i_pointer 指针变量
地址存入 指针变量
&与*运算符
含义 含义: 取变量的地址 含义: 取指针所指向变量的内容 两者关系:互为逆运算 单目运算符 单目运算符 优先级: 2 理解 优先级: 2
结合性:自右向左 结合性:自右向左 …... 2000 2001 2002
整型变量i
直接访问与间接访问
直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量
…...
2000 2001 2002 2003 2004 3 20 10
整型变量i
例
i=3;
-----直接访问
变量i_pointer
2000
2005
2006
指针变量
例
*i_pointer=20;
-----间接访问
(main) …...
2000 2002 2004
2006 2008
200A 200C 200E 2010
9 5 5 9 2000 2002
(swap)
整型变量a 整型变量b 指针pointer_1 指针pointer_2
பைடு நூலகம்
2000 2002 5
...
指针p1 指针p2
整型p
例 将数从大到小输出 swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } 地址传递 main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
运行结果:9,5 (main) …...
2000 2002 2004
2006 2008
200A 200C 200E 2010
9 5 5 9 2000 2002
整型变量a 整型变量b 指针pointer_1 指针pointer_2
...
例 将数从大到小输出 swap(int *p1, int *p2) { int *p; 2000 *p=*p1; int x; 2002 *p1=*p2; int *p=&x;x; 2004 *p2=*p; 2006 } 编译警告! 2008 main() 结果不对! COPY 200A { int a,b; 200C int *pointer_1,*pointer_2; 200E scanf("%d,%d",&a,&b); 2010 pointer_1=&a; pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
危险!
…...
2000 2001 2002 2003 2004 2005 2006 …... 随机
整型变量i
10
指针变量p
例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }
零指针与空类型指针
零指针:(空指针)
定义:指针变量值为零 表示: int * p=0;
i k
2005
…...
变量是对程序中数据 存储空间的抽象
指针与指针变量
指针:一个变量的地址 指针变量:专门存放变量地址的变量叫~
指针 2000 …... 整型变量i
变量的地址
2001
10
2002
2003 2004 2005 2000 2006 指针变量 变量地址(指针) 指向 变量 变量值 …...
指针变量的初始化
一般形式:[存储类型] 数据类型 *指针名=初始地址值; 例 int i; int *p=&i; 赋给指针变量, 不是赋给目标变量 变量必须已说明过 类型应一致
例
例 int i; int *p=&i; int *p=&i; int i; int *q=p;
用已初始化指针变量作初值
运行结果:5,9 (main) …...
5 9 2000 2002
(swap)
整型a 整型b pointer_1 pointer_2 指针p1 指针p2 指针p
2000 2002 2002 2000 2000 ****
...
§10.3 指针与数组
指向数组元素的指针变量
f86 f87 f88 f89 f8a f8b f8c …... f86
整型变量a 指针变量pa
10
例 输入两个数,并使其从大到小输出
main() { int *p1,*p2,*p,a,b; 2000 scanf("%d,%d",&a,&b); 2002 p1=&a; p2=&b; 2004 if(a<b) 2006 { p=p1; p1=p2; p2=p;} 2008 printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); }
例 main( ) { int i; static int *p=&i; ..............
}
( )
不能用auto变量的地址 去初始化static型指针
指针变量必须先赋值,再使用 例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }
(main)
5 9 9 2000 2002
(swap)
2000 2002 ****
...
指针变量在使用前 必须赋值!