第10章指针类型习题及答案
第十章 C++ 基础

华厦职业学院
C语言程序设计
其中public是成员的属性说明,表示公有成员, 类的成员还可以声明为private(私有成员)或 protected(保护成员),不同属性的成员在访问时 规则不同。 类定义好之后,可以像结构那样定义变量,方 法是: 类的名称 变量名称;
华厦职业学院
C语言程序设计
在C++中类定义的变量称为对象(object),在定 义对象时,也可以用类名来定义类变量的指针,注 意在使用时类名称之前不写class。例如: time t; // t是类time的一个对象; time *pt; // pt是一个指向类对象的指针
华厦职业学院
C语言程序设计
关于成员函数,有以下规则: (1) 成员函数是类的函数,不能独立执行,必须要 用一个对象或对象指针来调用执行,什么对象调用 成员函数,成员函数就作用于什么对象,既成员函 数的执行结果依赖于具体的对象; (2) 成员函数中可以存取同一个类中的成员变量, 这些成员变量就是相应对象的成员变量;成员函数 也可以调用同一个类中的其它成员函计
10.3
构造函数与析构函数
10.3.1 构造函数 用类来定义对象变量时,往往需要让对象有一个初始值, 完成这种功能的函数就是构造函数。构造函数是与类同名的 函数,但函数没有任何返回类型,也不是void类型,例如: class time { public: int h,m,s; time() { h=0; m=0; s=0; } void set(int th,int tm,int ts) { h=th; m=tm; s=ts; } void show(); };
华厦职业学院
C语言程序设计
10.1 类与对象 10.2 this指针 10.3 构造函数与析构函数 10.4 引用与复制构造函数 10.5 动态内存分配 10.6 类成员的访问规则 10.7 对象的赋值 10.8 运算符重载
第十章 指针

19
10.4 字符串与指针
字符串的表示形式
1. 可以用字符数组表示字符串
main() { char string[]=”I love China!”; printf(“%s\n”, string); }
2. 可用字符指针变量来表示
main() { char *string=”I love China!”; printf(“%s\n”, string); }
9
10.2.2 指针变量的引用
& :取地址运算符 * :指针运算符
i_pointer-----指针变量,它的内容是地址量 Eg10.1 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 main() &*i_pointer等价于i_pointer { (&*i_pointer)++与&*i_pointer++的区别 int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1,*pointer_2); }
21
10.5 指向函数的指针
赋值 函数名代表该函数的入口地址。因此,可用 函数名给指向函数的指针变量赋值。 指向函数的指针变量=[&]函数名;
注意:函数名后不能带括号和参数;函数名前的 “&”符号是可选的。
调用格式 (*函数指针变量)([实参表])
22
用指向函数的指针作函数参数
c语言 ●第10章 指针-1

…
19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。
…
p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。
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++课后习题答案第十章

(c)outfile.write(( char* ) &data , sizeof( float ));
(d)outfile.write(( char* ) &data , data );
10.2
1.#include <iostream.h>
cout.setf(ios::right,ios::left);
cout <<x<< endl;
cout.setf( ios::showpos );
cout <<x<< endl;
cout <<-x<< endl;
cout.setf( ios :: scientific );
cout <<x<< endl;
}
答案:
123.456
123.456
123.456
+123.456
-123.456
+1.234560e+002
2.#include <iostream.h>
void main()
{ double x=123.45678;
cout.width(10);
cout<<("#");
cout <<x<< endl;
do
{
infile.read((char *)&gzrec,sizeof(txrec));
}while (strcmp(gzrec.no,num)!=0 && infile.tellp()!=posend);
chap10(文件)

10.2 文件操作 在对文件读、写之前必须先打开该文件, 在对文件读 、 写之前必须先打开该文件 , 使用结束后 应关闭该文件。 应关闭该文件。 一、 文件打开函数 fopen 函数调用格式: 函数调用格式: FILE *fp; fp=fopen(“文件名”,“使用方式”); 文件名” 使用方式 使用方式” 文件名 打开指定的文件,以指定的使用方式进行访问。 打开指定的文件,以指定的使用方式进行访问。 说明: 说明: 指向打开的文件后, 就可以用它来访问该文件。 用 fp 指向打开的文件后 就可以用它来访问该文件。 文件名”为任何合法的DOS文件名。 文件名。 “文件名”为任何合法的 文件名 有的C 版本只用r、 、 ,或只用rw、 而不用r+、 有的 版本只用 、w、a,或只用 、ra 而不用 、 w+、a+ 、 在程序运行时, 系统自动打开三个标准文件stdin、 在程序运行时 , 系统自动打开三个标准文件 、 stdout、stderr。 、 。
第 10 章
10.1 文件操作库函数
文件
一、 概述 C语言将文件看作是一个字符 字节 序列组成的 。 语言将文件看作是一个字符(字节 序列组成的。 语言将文件看作是一个字符 字节)序列组成的 分为ASCII文件和二进制文件两种。 文件和 两种。 分为 文件 二进制文件两种 C的“缓冲 输出 文件系统” 文件系统 ” 自动 缓冲区 地在内存中开辟 一个文件缓冲区, 程序 一个文件缓冲区 磁盘 在对文件进行处 数据区 文件 理时, 通过文件 输入 缓冲区进行输入 缓冲区 与输出。 与输出。
文本文件中的回车换行符在输入时转换为一个换行符, 文本文件中的回车换行符在输入时转换为一个换行符, 在输出时又转换为回车换行符。 在输出时又转换为回车换行符。 为了可靠地打开指定的文件, 常用下列方法: 为了可靠地打开指定的文件 常用下列方法: if ((fp=fopen(“file1” , “ r ”))==NULL) { printf(“cannot open this file\n”); exit(0); } 二、 文件关闭函数 fclose 使用完一个文件后必须关闭它, 使用完一个文件后必须关闭它 , 以防数据丢失和 被其它操作误用。 被其它操作误用。 fclose函数的调用格式: 函数的调用格式: 函数的调用格式 fclose(文件指针 文件指针); 文件指针 关闭文件时的操作就是使指针与文件“脱钩” 关闭文件时的操作就是使指针与文件“脱钩”。正常 关闭时fclose函数返回 值,关闭有误时返回非 值。 函数返回0值 关闭有误时返回非0值 关闭时 函数返回
C语言第十章复习题(含答案)

1.若有说明:int i,j=7, *p=&i;,则与i=j;等价的语句是(B )。
(A)i= *p; (B)*p=*&j; (C)i=&j; (D)i=* *p;2.若有以下说明:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为6的表达式是( C)。
(A)*p+6 (B)*(p+6) (C)*p+=5 (D)p+53.若有以下定义和语句:char *s1="12345",*s2="1234";printf("%d\n",strlen(strcpy(s1,s2)));则输出结果是( A)。
(A)4 (B)5 (C)9 (D)104.以下不能正确进行字符串赋初值的语句是(A )。
(A) char str[5]="good!"; (B) char str[]="good!";(C) char *str="good!"; (D) char str[5]={‘g',‘o',‘o',‘d'};5.若定义:int a=511,*b=&a;, 则printf("%d\n",*b);的输出结果为( D )。
(A) 无确定值 (B) a的地址 (C) 512 (D) 5116.下面程序的输出是( A )。
(A) 3 (B) 4 (C) 1 (D) 2main(){ int a[10]={ 1,2,3,4,5,6,7,8,9,10},*p=a;printf("%d\n",*(p+2));}7.若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是(D )。
(A) p=q; (B) *p=*q; (C) n=*q; (D) p=n;8.有如下说明int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是( B )。
c语言第10章指针

3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章指针类型习题及其答案10-2 定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r.解:int a,b,c,d,e,f,x,y,z ;int *p,*q,*r ;p=&a;q=&b;r=&c ;p=&d;q=&e;r=&f ;p=&x;q=&y;r=&z ;printf(“%l,%l,%l”,p,q,r) ;printf(“%d,%d,%d”,*p,*q,*r) ;思考:指针也是一种数据类型吗?他可以不依赖其它数据类型而独立存在吗?10-3 应用指针,实现10个整数从打到小的排序输出。
解:#include "stdio.h"void main(){int i,j,a[10],*p,t;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++){p=&a[i] ;for(j=i+1;j<10;j++)if(a[j]>*p) p=&a[j] ;t=*p;*p=a[i];a[i]=t;}printf("排序后的数组为:\n");for(i=0;i<10;i++)printf("%d,",a[i]) ;}思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何?10-4 应用指针,求n个数的最小值和最大值。
解:#include "stdio.h"#define L 100void main(){int i,n,a[L],*max,*min;printf("请确定欲输入数据的个数(<100):");scanf("%d",&n);printf("下面请依次输入%d的个数\n",n);for(i=0;i<n;i++){printf("第%d的个数:",i+1);scanf("%d",&a[i]);}max=min=&a[0] ;for(i=0;i<n;i++){if(a[i]>*max) max=&a[i];if(a[i]<*min) min=&a[i];}printf("最大值=%4d,最小值=%4d\n",*max,*min);}思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计?10-5 应用指针,编写下列字符串处理函数:(1) 字符串的复制函数。
(2) 字符串的连接函数。
解:#include "stdio.h"void copy_string(char *from ,char *to){for(;*from!='\0';from++,to++)*to=*from ;*to='\0';}void link_string(char *from,char *to){for(;*to!='\0';to++);for(;*from!='\0';from++,to++)*to=*from ;*to='\0';}void main(){char a[16]="I am a teacher.";char b[40]="you are a student.";printf("复制与连接之前:\nstring_a=%s\nstring_b=%s\n",a,b); copy_string(a,b);printf("复制之后:\nstring_a=%s\nstring_b=%s\n",a,b);link_string(a,b) ;printf("连接之后:\nstring_a=%s\nstring_b=%s\n",a,b);}思考:字符指针与字符数组的主要区别是什么?字符数组名代表什么?它与字符指针有何本质的区别?此程序连接之后的输出结果是什么?10-6 应用指针,求一矩阵中行为最大,列为最小的元素。
解:#include "stdio.h"#define N 5void main(){int i,j,a[N][N],*p,(*q)[N],max_min,k,n,flag=0;printf("请输入数组的个元素的值:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);for(i=0;i<N;i++) //输出数组元素的值{printf("\n");for(j=0;j<N;j++)printf("%d",a[i][j]) ;}for(i=0;i<N;i++){k=0;p=&a[i][0];max_min=*p;for(j=0;p=a[i]+N;p++,j++);if(max_min<*p){max_min=*p;k=j;}q=a;n=0;for(;q<a+N;q++,n++)if(max_min>*(*q+k)) break ;if(n==N){flag=1;printf("\n满足条件的元素为第%d行第%d列的:%d\n",i+1,k+1,max_min) ;}}if(flag!=1) printf("\n没有满足条件的元素!") ;}思考:此题与习题8-13类似,请比较这两种不同方式表示的程序,它们各有何特点?10-7 应用指针,完成复数的加,减运算。
解:(略,参见习题9-13。
)10-8 应用指针,求n个数的最大公约数和最小公倍数。
解:#include "stdio.h"#define N 50int gys(int x,int y) //求两个数的最大公约数{int t;if(y>x) {t=x;x=y;y=t;}while(y!=0){t=x%y;x=y;y=t;}return x ;}int gbs(int x,int y) //求两个数的最小公倍数{int t;t=gys(x,y);return x*y/t ;}void main(){int n,i,a[N],*p=a;int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数printf("请确定数据的个数n(<50):");scanf("%d",&n);printf("请输入%d个数据的值:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);//int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数for(i=0;i<n-1;i++){t1=gys(t1,*(p+i+1));t2=gbs(t2,*(p+i+1)) ;}printf("最大公约数为%d,最小公倍数为%d:\n",t1,t2);}思考:“t1=gys(t1,*(p+i+1))”语句的功能是什么?能否用数组小标元素直接处理?试比较之。
10-9 有N个人围成一圈,顺序编号,从第一个人开始按1、2、3顺序报数,凡报到3的人退出圈子,然后从出圈的下一个人开始重复此过程。
应用指针,输出出圈序列。
解:#include "stdio.h"#define N 100void main(){int a[N],i,k,n,m,*p;printf("请输入人数(<100):");scanf("%d",&n);for(i=0;i<n;i++)a[i]=i+1 ; //为每个人编号p=a ;i=0; //小标计数标量k=0 ; //1,2,3报数时的计数变量m=0 ; //退出人数的计数器的变量while(m<n){if(*(p+i)!=0) k++ ;if(k==3){printf("%d,",*(p+i));*(p+i)=0 ; //将退出的编号置为0k=0;m++ ;}i++ ;if(i==n) i=0 ; //报数到尾后,i应恢复为0}}思考:此题不用指针也可以完成,应做哪些修改?此题不用数组是否也可以实现其计算过程?10-10 应用指针,完成数组的关系运算。
对于数组a、b,a>b成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,a<b、a=b类似定义。
解:#include "stdio.h"#define N 2void main(){int a[2][N],t[2]={0,0};int i,j,*p1,*p2;for(i=0;i<2;i++){printf("请输入第%d个数组的元素\n",i+1);for(j=0;j<N;j++)scanf("%d",&a[i][j]);}for(i=0;i<2;i++){if(i==0) p1=a[0],p2=a[1];else p1=a[1] ,p2=a[0] ;for(j=0;j<N;j++){if(*(p1+j)>*(p2+j))t[i]++;}}if(t[0]>t[1])printf("第一个数组大于第二个数组\n");else if(t[0]==t[1])printf("第一个数组等于第二个数组\n");elseprintf("第一个数组小于第二个数组\n");}思考:程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?10-11 应用指针编写程序,判断空间中的一个点是否在一立方体内。