⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 练习(五).txt

📁 谭浩强的C语言题集
💻 TXT
📖 第 1 页 / 共 3 页
字号:
指针
一、选择题
1、以下程序的运行结果是(   )
	sub(int x,int y,int *z)
	{
		*z=y-x;
	}
	void main()
	{
		int a,b,c;
		sub(10,5,&a);
		sub(7,a,&b);
		sub(a,b,&c);
		printf("%4d,%4d,%4d\n",a,b,c);
	}
   (A)    5,   2,   3
   (B)   -5, -12,  -7
   (C)   -5, -12, -17
   (D)    5,  -2,  -7
2、执行以下程序后,a的值为(   ),b的值为(   )
	void main()
	{
		int a,b,k=4,m=6,*p1=&k,*p2=&m;
		a=p1==&m;
		b=(-*p1)/(*p2)+7;
		printf("a=%d\n",a);
		printf("b=%d\n",b);
	}
① (A) -1
   (B) 1
   (C) 0
   (D) 4
② (A) 5
   (B) 6
   (C) 7
   (D) 10
3、下面程序应能对两个整型变量的值进行交换。以下正确的说法是(   )
	void main()
	{
		int a=10,b=20;
		pirntf("(1) a=%d,b=%d\n",a,b);
		swap(&a,&b);
		printf("(2) a=%d,b=%d\n",a,b);
	}
	swap(int p,int q)
	{
		int t;
		t=p;p=q;q=t;
	}
   (A) 该程序完全正确
   (B) 该程序有错,只要将语句swap(&a,&b); 中的参数改为a,b即可
   (C) 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可
   (D) 以上说法都不正确
4、有四组对指针变量进行操作的语句,以下判断正确的选项是(   )
	(1) int *p,*q; q=p;
	    int a,*p,*q; p=q=&a;
	(2) int a,*p,*q; q=&a; p=*q;
	    int a=20,*p; *p=a;
	(3) int a=b=0,*p; p=&a; b=*p;
	    int a=20,*p,*q=&a; *p=*q;
	(4) int a=20,*p,*q=&a; p=q;
	    int p,*q; q=&p;
   (A) 正确:(1)	不正确:(2)(3)(4)
   (B) 正确:(1)(4)	不正确:(2)(3)
   (C) 正确:(3)	不正确:(1)(2)(4)
   (D) 以上结论都不正确
5、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是(   )
	void main()
	{
		int *p,*q,a,b;
		p=&a;
		printf("input a: ");
		scanf("%d",*p);
			.
			.
			.
	}
   (A) *p表示的是指针变量p的地址
   (B) *p表示的是变量a的值,而不是变量a的地址
   (C) *p表示的是指针变量p的值
   (D) *p只能用来说明p是一个指针变量
6、以下程序有错,错误原因是(   )
	void main()
	{
		int *p,i;
		char *q,ch;
		p=&i;
		q=&ch;
		*p=40;
		*p=*q;
		.
		.
		.
	}
   (A) p和q的类型不一致,不能执行*p=*q; 语句
   (B) *p中存放的是地址值,因此不能执行*p=40; 语句
   (C) q没有指向具体的存储单元,所以*q没有实际意义
   (D) q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行*p=*q; 语句
7、有如下语句 int a=10,b=20,*p1,*p2; p1=&a; p2=&b; 若要让p1也指向b,可选用的赋值语句是(   )
   (A) *p1=*p2;
   (B) p1=p2;
   (C) p1=*p2;
   (D) *p1=p2;
8、已有定义int k=2; int *ptr1,*ptr2; 且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是(   )
   (A) k=*ptr1+*ptr2;
   (B) ptr2=k;
   (C) ptr1=ptr2;
   (D) k=*ptr1*(*ptr2);
9、变量的指针,其含义是指该变量的(   )
   (A) 值
   (B) 地址
   (C) 名
   (D) 一个标志
10、若已定义int a=5; 下面对(1),(2)两个语句的正确解释是(   )
	(1) int *p=&a;		(2) *p=a;
   (A) 语句(1)和(2)中的*p含义相同,都表示给指针变量p赋值
   (B) (1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p
   (C) (1)在对p进行说明的同时进行初始化,使p指向a
       (2)将变量a的值赋给指针变量p
   (D) (1)在对p进行说明的同时进行初始化,使p指向a
       (2)将变量a的值赋于*p
11、若有语句int *point ,a=4; 和point=&a; 下面均代表地址的一组选项是(   )
   (A) a,point,*&a
   (B) &*a,&a,*point
   (C) *&point,*point,&a
   (D) &a,&*point,point
12、若已有说明float *p,m3.14; 要让p指向m,则正确的赋值语句是(   )
   (A) p=m;
   (B) p=&m;
   (C) *p=m;
   (D) *p=&m;
13、若有说明:int *p,m=5,n; 以下正确的程序段是(   )
   (A) p=&n;
       scanf("%d",&P);
   (B) p=&n;
       scanf("%d",*p);
   (C) scanf("%d",&n);
       *p=n;
   (D) p=&n;
       *p=m;
14、若有说明:int *p1,*p2,m=5,n; 以下均是正确赋值语句的选项是(   )
   (A) p1=&m; p2=&p1;
   (B) p1=&m; p2=&n; *p1=*p2;
   (C) p1=&m; p2=p1;
   (D) p1=&m; *p2=*p1;
15、已有变量定义和函数调用语句;int a=25; print_value(&a); 下面函数的正确输出结果是(   )
	void print_value(int *x)
	{
		printf("%d\n",++*x);
	}
   (A) 23
   (B) 24
   (C) 25
   (D) 26
16、下面判断正确的是(   )
   (A) char *a="china"; 等价于char *a; *a="china";
   (B) char str[10]={"china"}; 等价于char str[10]; str[]={"china"};
   (C) char *s="china"; 等价于char *s; s="china";
   (D) char c[4]="abc",d[4]="abc"; 等价于char c[4]=d[4]="abc";
17、设char *s="\ta\017bc"; 则指针变量s指向的字符串所占的字节数是(   )
   (A) 9
   (B) 5
   (C) 6
   (D) 7
18、下面程序段中,for循环的执行次数是(   )
	char *s="\ta\018bc";
	for( ; *s!='\0'; s++) printf("*");
   (A) 9
   (B) 5
   (C) 6
   (D) 7
19、下面能正确进行字符串赋值操作的是(   )
   (A) char s[5]={"ABCDE"};
   (B) char s[5]={'A','B','C','D','E'};
   (C) char *s; s="ABCDE";
   (D) char *s; scanf("%s",s);
20、下面程序段的运行结果是(   )
	char *s="abcde";
	s+=2; printf("%d",s);
   (A) cde
   (B) 字符'c'
   (C) 字符'c'的地址
   (D) 无确定的输出结果
21、设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是(   )
   (A) c=*p1+*p2;
   (B) p2=c;
   (C) p1=p2;
   (D) c=*p1*(*p2);
22、设有下面的程序段:
	char s[]="china"; char *p; p=s;
    则下列叙述正确的是(   )
   (A) s和p完全相同
   (B) 数组s中的内容和指针变量p中的内容相等
   (C) s数组长度和p所指向的字符串长度相等
   (D) *p与s[0]相等
23、下面程序段的运行结果是(   )
	char *format="%s,a=%d,b=%d\n";
	int a=1,b=10;
	a+=b;
	printf(format,"a+=b",a,b);
   (A) for,"a+=b",ab
   (B) format,'a+=b"
   (C) a+=b,a=11,b=10
   (D) 以上结果都不对
24、下面程序段的运行结果是(   )
	char *p="%d,a=%d,b=%d\n";
	int a=111,b=10,c;
	c=a%b; p+=3;
	printf(p,c,a,b);
   (A) 1,a=111,b=10
   (B) a=1,b=111
   (C) a=111,b=10
   (D) 以上结果都不对
25、以下正确的程序段是(   )
   (A) char str[20];
   (B) char *p;
   (C) char str[20];
       scanf("%s",&str[2];)
   (D) char str[20],*p=str;
       scanf("%s",p[2]);
26、以下正确的程序段是(   )
   (A) char str1[]="12345",str2[]="abcdef";
       strcpy(str1,str2);
   (B) char str[10],*st="abcde"; strcat(str,st);
   (C) char str[10]=" ",*st="abcde"; strcat(str,st);
   (D) char *st1="12345",*st2="abcde"; strcat(st1,st2);
27、下面程序段的运行结果是(   )
	char str[]="ABC",*p=str;
	printf("%d\n",*(p+3));
   (A) 67
   (B) 0
   (C) 字符'C'的地址
   (D) 字符'C'
28、下面程序段的运行结果是(   )
	char *p="abcdefgh";
	p+=3;
	printf("%d\n",strlen(strcpy(p,"ABCD")));
   (A) 8
   (B) 12
   (C) 4
   (D) 7
29、下面程序段的运行结果是(   )
	char a[]="language",*p;
	p=a;
	while(*P!='u') {printf("%c",*p-32); p++;}
   (A) LANGUAGE
   (B) language
   (C) LANG
   (D) langUAGE
30、若有语句:char s1[]="string",s2[8],*s3,*s4="string2"; 则对库函数strcpy的错误调用是(   )
   (A) strcpy(s1,"string2");
   (B) strcpy(s4,"string1");
   (C) strcpy(s3,"string1");
   (D) strcpy(s1,s2);
31、以下与库函数strcpy(char *p1,char *p2)功能不相等的程序段是(   )
   (A) strcpy1(char *p1,char *p2){while((*p1++=*p2++)!='\0');}
   (B) strcpy2(char *p1,char *p2){while((*p1=*p2)!='\0'{p1++;p2++;}}
   (C) strcpy1(char *p1,char *p2){while((*p1++=*p2++);}
   (D) strcpy1(char *p1,char *p2){while(*p2) *p1++=*p2++;}
32、以下与库函数strcmp(char *s,char *t)的功能相等的程序段是(   )
   (A) 	strcmp(char *s,char *t)
	{
		for( ; *s++==*t++; }
			if(*s=='\0') return 0;
		return *s-*t;
	}
   (B) 	strcmp2(char *s,char *t)
	{
		for( ; *s====*t++; }
			if(!*s) return 0;
		return *s-*t;
	}
   (C) strcmp3(char *s,char *t)
	{
		for( ;*t==*s; )
			for( ; *t==*s; )
			{
				if(!*t) return 0; t++; s++;
			}
		return *s-*t;
	}
   (D) 	strcmp4(char *s,char *t)
	{
		for( ; *s==*t; s++,t++)
			if(!*s) return 0;
		return *t-*s;
	}
33、下面说明不正确的是(   )
   (A) char a[10]="china";
   (B) char a[10],*p=a; p="china";
   (C) char *a; a="china";
   (D) char a[10],*p; p=a="china";
34、若有说明语句
	char a[]="It is mine";
	char *p="It is mine";
	则以下不正确的叙述是(   )
   (A) a+1表示的是字符t的地址
   (B) p指向另外的字符串时,字符串的长度不受限制
   (C) p变量中存放的地址值可以改变
   (D) a中只能存放10个字符
35、若已定义char s[10]; 则在下面表达式中不表示s[1]的地址的是(   )
   (A) s+1
   (B) s++
   (C) &s[0]+1
   (D) &s[1]
36、下面程序段的运行结果是(   )
	char s[6]; s="abcd", printf("\"%s\"\n",s);
   (A) "abcd"
   (B) "abcd "
   (C) \"abcd\"
   (D) 编译出错
37、下面程序的功能是从输入的十个字符串中找出最长的那个串。请选择填空。①(   )②(   )
	#include<stdio.h>
	#include<string.h>
	#define N 10
	void main()
	{
		char str[N][81],*sp;
		int i;
		for(i=0;i<N;i++) gets(str[i]);
		sp= ① ;
		for(i=1;i<N;i++) if(strlen(sp)<strlen(str[i])) ②;
		printf("sp=%d,%s\n",strlen(sp),sp);
	}
① (A) str[i]
   (B) &str[i][0]
   (C) str
   (D) str[N]
② (A) str[i]
   (B) &str[i][0]
   (C) str
   (D) str[N]
38、下面程序的功能是将一个整数字符串转换为一个整数,如"-1234"转换为-1234。请选择填空。
	#include<stdio.h>
	#include<string.h>
	void main()
	{
		char s[6];
		int n;
		gets(s);
		if(*s=='-') n=-chnum(s+1);
		else n=chnum(s);
		printf("%d\n",n);
	}
	chnum(char *p)
	{
		int num=0,k,len,j;
		len=strlen(p);
		for( ; ① ; p++)
		{
			k= ② ;
			j=(--len);
			while( ③ ) {k=k*10;}
			num=num+k;
		}
		return num;
	}
① (A) *p!='\0'
   (B) *(++p)!='\0'
   (C) *(p++)!='\0'
   (D) len!=0
② (A) *p
   (B) *p+'0'
   (C) *p-'0'
   (D) *p-32
③ (A) --j>0
   (B) j-->0
   (C) --len>0
   (D) len-->0
39、下面程序的功能是将八进制正整数字符串转换为十进制整数。请选择填空。
	#include<stdio.h>
	void main()
	{
		char *p,s[6]; int n;
		p=s;
		gets(p);
		n= ① ;
		while( ② !='\0') n=n*8+*p-'0';
		printf("%d\n",n);
① (A) 0
   (B) *p
   (C) *p-'0'
   (D) *p+'0'
② (A) *p
   (B) *p++
   (C) *(++p)
   (D) p
40、下面程序的功能是统计子串substr在母串str中出现的次数。请选择填空。
	#include<stdio.h>
	void main()
	{
		char str[80],substr[80];
		int n;
		gets(str); gets(substr);
		printf("%d\n",count(str,substr));
	}
	count(char *str,char *substr)
	{
		int i,j,k,num=0;
		for(i=0; ① ;i++)
			for( ② ,k=0; substr[k]==str[j]; k++; j++)
				if(substr[③]=='\0'){num++;break;}
		return num;
	}
① (A) str[i]==substr[i]
   (B) str[i]!='\0'
   (C) str[i]=='\0'
   (D) str[i]>substr[i]
② (A) j=i+1
   (B) j=i
   (C) j=0
   (D) j=1
③ (A) k
   (B) k++
   (C) k+1
   (D) ++k
41、下面程序的功能是在字符串str中找出最大的字符并放在第一个位置上,并将该字符前的原字符往后顺序移动,如chyab变成ychab。请选择填空。
	#include<stdio.h>
	void main()
	{
		char str[80],*p,max,*q;
		p=str; gets(p); max=*(p++);
		while(*p!='\0')
		{
			if(max<*p) {max=*p; ① ;}
			p++;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -