第3章数据类型——指针习题及参考答案
1.若正常执行了如下语句:
int m[5]={9,8,4,5,6},*p1=m,*p2=&m[3],n;
n=p2-p1;
则n的值为(3 )。
2.若正常执行了如下语句:
int m[]={1,2,3,4,5,6,7,8},*p1=m+3,*p2=&m[6],*p3;
p3=p1+3;
cout< 则程序的输出是(4,7,7 )。 3.P为一指针变量,取p所指向单元的数据作为表达式的值,然后使p指向下一个单元的表达式是(*p++ )。 4.P为一指针变量,取p所指向单元的数据作为表达式的值,然后使该单元的数据值增1的表达式是((*p)++ )。 5.P为一指针变量,使p指向下一个单元,然后取该单元的数据作为表达式的值的表达式是(*++p )。 6.p1,p2都是字符指针,p1指向字符串“ABCDEFGIJKLMN”,p2-p1的差为9,则执行语句cout< 7.已知变量ld定义为:long ld;,现需要一个指向ld的指针p,但又禁止通过p修改ld,则p应定义为(const long *p=&ld )。 8.已知指针p为int型指针,且其指针值为5000,则p+3的指针值为(5000+3*sizeof(int) )。11.(单选)下列说法正确的是()。 A.空指针也称为void指针,是一种不指向任何数据的指针。 B.空指针也称为无类型指针,是一种可指向任何类型数据的指针。 C.除了void指针外,任何非空指针都指向某种既定类型的数据。 D.void指针也称为无类型指针,是一种不指向任何数据的指针。 12.(单选)下列说法正确的是()。 A.在2000,2001,2002…2007这几个连续的地址单元中可存放8个数据。 B.在2000,2001,2002…2007这几个连续的地址单元中可存放8个字符。 C.在2000,2001,2002…2007这几个连续的地址单元中可存放字符串”ABCDEFGH”。D.在2000,2001,2002…2007这几个连续的地址单元中可存放8个整数。 13.(单选)已知一运行正常的程序中有这样两个语句: int *p1,*p2=&a; p1=b; 由此可知,变量a和b的类型分别是()。 A.int和int B.int *和int C.i nt和int* D.int*和int* 14.(多选)已知变量ld定义为:long ld;在下面关于指针p的定义中,不能通过p修改ld 的有()。 A.long *p=&ld; B.l ong const *p=&ld; C.l ong *const p=&ld; D.const long *p=&ld; 15.(单选)已知I,j都是整形变量,下列表达式中,与下标引用X[I][j]不等效的是()。A.*(X[I]+j) B.*(X+I)[j] C.*(X+I+j) D.*(*(X+I)+j) 16.(单选)要使指针变量p指向2维数组A的第一个元素(0行0列元素),正确的赋值表达式是()。 A.p=A或p=A[0][0] B.p=A[0]或p=A[0][0] C.p=A[0]或p=&A[0][0] D.p=A或p=&A[0][0] 17.下列程序功能是:将字符串中的小写字母都改成对应的大写字母,其他字母不变。请更改程序中的错误。 #include #include char *fun(char str ) //? { int i; for(i=0;str;i++) //? if((…a?<=str[i])||(str[i]<=?z?)) str[i]+=32; //? return *str; //? } main() { char str[81]; printf(“\n Please enter a string:”); gets{str[81]}; printf(“\n The result string is:\n%s”,fun(str)); } 18.要使用引用jr代表变量int j;jr应定义为()。 19.要使引用pr代表变量char *p;pr应定义为()。 20.已知变量a,b定义为:int a=99,&b=a;则cout< 21.已知变量x,y定义为:int x[]={99,98,97},&y=x[1];则cout< 22.已知函数fa的原形是:int fa(int,char *);,pfa是指向fa的指针,则pfa的定义是()23.已知函数fb的原形是:char *fb(const char *);,pfb是指向fb的指针,则pfb的定义是()。24.(单选)已知函数f1的原形是:void f1(int *a,char *b);,变量v1,v2的定义是:int v1;char v2[]=”ABCDW”;,把v1和v2分别作为第一参数和第二参数来调用函数f1,正确的调用语句是()。 A.f1(v1,v2); B.f1(&v1,v2); C.f1(v1,&v2); D.f1(&v1,&v2); 25.(单选)已知函数f1的原形是: void f1(int *a,long b); 变量v1,v2的定义是: int v1;long v2; 把v1和v2分别作为第一参数和第二参数来调用函数f1,正确的调用语句是()。 A.f1(v1,v2); B.f1(&v1,v2); C.f1(v1,&v2); D.f1(&v1,&v2); 26.指针函数与函数指针的区别: 指针函数:返回指针值的函数 函数指针:指向函数的指针 (1)指针函数与函数指针形式上的区别: int f1(int n){…} char *f2(int n,char *s){…} int (*pf1)(int); pf1=f1;//或合并为:int (*pf1)(int)=f1; char *(*pf2)(int ,char *); pf2=f2;//或合并为:char *(*pf2)(int,char *)=f2; (2)函数指针的应用: #include int add(int a,int b){return a+b;} void main() { int (*p)(int ,int); p=add; cout< cout<<(*p)(3,5); //8 cout< cout<<(*add)(3,5); //8 } (3)函数指针作为参数传递 int add(int a,int b){return a+b;} int sub(int a,int b){return a-b} int double(int a,int b,int (*p)(int ,int)){ return p(a,b)*2; } void main() { cout< cout< } 上述习题参考答案 1. 3 2.4,7,7 3.*p++ 4.(*p)++ 5.*++p 6.KLMN 7.const long *p=&ld 8.5000+3*sizeof(int) 11.C 12.B 13.C 14.BD 15.C 16.C 18.int &jr=j; 19.char *&pr=p; 20.98,100 21.97,196 22.int (*pfa)(int,char *)=fa; 23.char *(*pfb)(const char *)=fb; 24.B 25.B 第十章指针 一、选择题 1.变量的指针,其含义是指该变量的_______________。 A) 值B) 地址C) 名D)一个标志 2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。 A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2) 3.若有定义int *p, m=5,n;以下程序段正确的是________________。 A) p=&n; B) p=&n; scanf("%d",&p); scanf("%d",*p); C) scanf("%d",&n); D) p=&n; *p=n; *p=m; 4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。 A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。 A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p 6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。 A) x B) p C) &x D) &*p 7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。 A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n; 8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。 A) x++ B) p++ C) *(p++) D) &x++ 9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。 A) < B) = C) + D) - 10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。 A) int *i=NULL; B) float *f=NULL scanf("%d",i); *f=10.5; C) char t='m',*c=&t; D) long *L; *c=&t; L='\0'; 11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。 void print_value(int *x) { printf("%d",++*x); } A) 23 B) 24 C) 25 D) 26 12. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。 A) s+1 B) s++ C) &s[0]+1 D) &s[1] 13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。 A)*&a[5]B)a+2 C)*(p+5) D)*(a+2) 14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。 A)p+5B)*a+1 C)&a+1 D)&a[0] 15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。 A)&a B)a+1 C)a D)&a[1] 16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。 A) int p[3]; B) int k; C) char *a[3]; D) int b[10]; 《C++指针》习题 学号姓名 一、选择题 1、有定义如下:int a[5], *p; 则下列描述错误的是B A.表达式p=p+1是合法的B.表达式a=a+1是合法的 C.表达式p-a是合法的D.表达式a+2是合法的 2、函数定义为Fun(int &i),变量定义n=100,则下面调用该函数正确的 是C A.Fun(20) B.Fun(20+n) C.Fun(n) D.Fun(&n) 3、若有说明int I,j=2,*p=&i;则能完成i=j赋值功能的语句是B A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 4、设已有定义char *st = "how are you";下列程序中正确的是A A.char a[11],*p;strcpy(p=a+1,&st[4]); B.char a[11];strcpy(++a,st); C. char a[11];strcpy(a,st); D. char a[],*p;strcpy(p=a[1],st+2); 5、设有数组int array[3][4],下列引用数组元素的方法中错误的是D A.array[i][j] B.*(*(array+i)+j) C. *(array[i]+j) D. *(array+i*4+j) 6、有定义int s[4][5],(*ps)[5];ps=s;则对数组s中元素引用的正确 的是C A.ps+1 B.*(ps+3) C. ps[0][2] D. *(ps+1)+3 7、设有说明int b[4][4],以下不能等价表示元素b[3][3]的是:B A.*&b[3][3] B.(*(*(b+3))+3) C.*(b[3]+3) D.*(*(b+3)+3) 8、若有说明"char *s[]={"234","5678","9012","3456","7890"};",则表达 式*s[1]> *s[3]比较的是B A."1234"和"9012" B.'5'和'3' C.'l'和'9' D."5678"和"3456" 9、设语句"char *s[]={"Student","Teacher","Father","Mother"},*ps=s[2];",执行语句"cout<<*s[1]<<','< 第十章指针 10.1 输入3个整数,按照从小到大的顺序输出 #include if(strcmp(str1,str3)) swap(str1,str3); if(strcmp(str2,str3)) swap(str2,str3); printf("the order: %s,%s,%s\n",str1,str2,str3); } void swap(char *p1, char *p2) { char temp[20]; strcpy(temp,p1); strcpy(p1,p2); strcpy(p2,temp); } NOTE:gets()用于获取字符串输入。strcmp() 和strcpy()的应用 10.3 输入10个整数,将其中最小的数和第一个数对换,把最大的数和最后一个数对换,写三个函数:①输入十个数;②进行处理;③输出十个数 #include 习题解答 一、单项选择题 1.若定义了int n=2, *p=&n, *q=p;则下面【】的赋值是非法的。 A.p=q B. *p=*q C. n=*q D. p=n 【答案】D 2.若定义了double *p, a;则能通过scanf函数给输入项读入数据的程序段是【】。 A.p=&a; scanf(“%1e”,p); B. *p=&a; scanf(“%1f”,p); C. p=&a; scanf(“%f”,p); D. p=&a; scanf(“%1f”,a); 【答案】C 3.若定义了int a[10], i=3, *p; p=&a[5];下面不能表示为a数组元素的是【】。 A.p[-5] B. a[i+5] C. *p++ D. a[i-5] 【答案】D 4.若有如下定义: int n[5]={1,2,3,4,5},*p=n; 则值为5的表达式是【】。 A.*+5 B. *(p+5) C. *p+=4 D. p+4 【答案】C 5.设变量b的地址已赋给指针变量ps,下面为“真”的表达式是【】。 A.b==&ps B. b==ps C. b==*ps D. &b==&ps 【答案】C 6.设有以下定义和语句: int a[3][2]={1,2,3,4,5,6},*p[3]; p[0]=a[1]; 则*(p[0]+1)所代表的数组元素是【】。 A.a[0][1] B. a[1][0] C. a[1][1] D. a[1][2] 【答案】C 7.若定义了char *str=”Hello!”;下面程序段中正确的是【】。 A.char c[ ], *p=c; strcpy(p,str); B.char c[5], *p; strcpy(p=&c[1],&str[3]); C.char c[5]; strcpy(c,str); D.char c[5]; strcpy(p=c+2,str+3); 【答案】B 8.若有下面的程序段,则不正确的fxy函数的首部是【】。 main() { int a[20], n; … fxy(n, &a[10]); … } A.void fxy(int i, int j) B. void fxy(int x, int *y) C. void fxy(int m, int n[]) D. void fxy(int p, int q[10]) 【答案】A 9.不合法的带参数main函数的首部形式是【】。 指针综合练习题 一、选择题 1.若有以下定义,则对a数组元素的正确引用是____d_____. int a[5],*p=a; a)*&a[5] b)a+2 c)*(p+5) d)*(a+2) 2.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为__d____. a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j 3.若有以下定义,则p+5表示___a____. int a[10],*p=a; a)元素a[5]的地址b)元素a[5]的值 c)元素a[6]的地址d)元素a[6]的值 4.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确 执行的赋值语句是____b____. a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2); 5.若有说明语句 char a[]="It is mine"; char *p="It is mine"; 则以下不正确的叙述是___d_____. a)a+1表示的是字符t的地址 b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符 二、填空题 1 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋给 它(2)和(3)的地址。使用变量名来访问变量,是按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。 答案:(1)地址 (2)NULL (3)已经分配了内存的变量的地址 (4)按变量的地址 (5)直接访问 (6)间接访问 2 以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。 请填空。 void main() {int *a,*b,*c,num,x,y,z; a=&x;b=&y;c=&z; cou<<"输入3个整数:"; cin>>a>>b>>c; cout<<*a<<*b<<*c; num=*a; 编程题 1用指向数组的指针变量输出数组的全部元素 #include第十章 指针
《C++指针》习题参考答案
C程序设计第三版第十章题解
教材课后题答案-第6章_指针习题答案
指针综合练习题(带答案)
指针练习题与答案