文档库 最新最全的文档下载
当前位置:文档库 › 指针练习题

指针练习题

C语言程序设计课堂练习题

第7章 指针
一、选择题
1.已知p是一个整型指针变量,且p指向的是整型变量a的地址,则下列哪个语句是错误的?( )
A.*p=a; B. p=&a; C.p=&*p; D.p=*&p;
2.下列哪一项是不正确的字符串赋值或不正确的赋初值的方式?()
A. char *str;str=“string“; B.char str[7]={’s’, ’t’, ’r’, ’i’, ’n’, ’g’ };
C. char str1[10];str1= “string“; D.char str1[]=“string“,*str2=”1234567”;
3.对于类型相同的指针变量,不能进行()运算。
A. + B. - C. = D.==
4.已知p是一个整型指针变量,a为一个一维整型数组,且p=a;则下列哪个语句是错误的?()
A.*p=a[0]; B. *p=*a; C. p=a+1; D.p=*a;
5.若有以下说明语句,则p2-p1的值为()
int a[10],*p1,*p2;
p1=a;
p2=&a[5];
A. 5 B. 6 C. 10 D.没有指针与指针的减法
6.下列定义中不正确的是()
A.int *p; B. int p[10]; C.int (*p)() D.int *(p(n));
7.以下程序的输出结果是()
main(){
int a[]={1,2,3,4,5,6},*p;
p=a;
printf(“%d,%d\n”,*p,*(p+4));
}
A. 0,5 B.1,5 C.0,6 D.1,6
8.若有以下说明和语句,且0<=i<10,则下面哪个不是对数组元素地址的正确表示()。
int a[]={1,2,3,4,5,6,7,8,9,10},*p,i;
p=a;
A.&(a+1) B.a++ C. &p D.&p[i]
二、写出程序的输出结果
1.main(){
int a=10,b=20,s,t,m,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa-*pb;
m=*pa**pb;
printf“s=%d\nt=%d\nm=%d\n“,s,t,m);
}
2.
main(){
int a[][3]={9,7,5,3,1,2,4,6,8};
int i,j,s1=0,s2=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{if (i==j) s1=s1+a[i][j];
if(i+j==2) s2=s2+a[i][j];
}
printf(“%d\n%d\n”,s1,s2);
}
3.
main(){
int a[5]={1,3,5,7,9},*p,**k;
p=a;k=&p;
printf(“%d”,*(p+2));
printf(“%d”,**k);
}
4.
main(){
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i=2,j=2;
p=a;
printf(“%d”,*(*(p+i)+j)+*((a+i)+j)+**(p+i)+**p);
}
三、填空
1. 在空格地方填上语句,以实现字符串复制的功能。
main(){
char *ps=“C language“;
char str[15];
char *p1,*p2;
p1=ps;
p2=str;
while(*p1!=’\0’)
{
(1)
(2)
(3)
}
*p2=’\0’;
printf(“ps=%s\n”,ps);
printf(“str=%s\n”,str);
}
2.下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,填空完成该程序。
main(){
int k=0;
char a[80],b[80],c[80]={‘\0’},*p,*q;
p=a;q=b;
gets(a);
gets(b);
while( (1) )
{ if ( (2) ) c[k]=*p;
else c[k]=*q;
p++;
(3)
k++;
}
if(*p!=0) strcat(c,p);
else strcat(c,q);
puts(c);
}
3.完成下面程序,以实现单词的输出功能。
main(){
char *s[]={“man”,”woman”,”girl”,”boy”,sister”};
char **q;
int k;
for(k=0;k<5;k++)
{ (1) ;
printf(“%s\n”,*q);

}
}
4.下列程序完成截取字符串s中从第m个位置开始的n个字符,返回所截字符串的首地址。
static char sub[20];
main(){
int m,n;
static char s[]=”good moring”;
char *cut(char *s1,int m1,int n1),*p;
scanf(“%d%d”,&m,&n);
p=cut(s,m,n);
printf(%s\n”,p);
}
char *cut(char *s1,int m1,int n1)
{int k;
for(k=0;ksub[k]= (1) ;
sub[k]=’\0’;
return (2) ;
}
5.下列程序求数组元素的平均值。
float f(int *p,int n)
{int i;
float avg=0.0;
for(i=0;iavg+=*p++;
(1) ;
return avg;
}
main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
float avg;
avg=f( (2) ,10);
printf(“\n Average=%f\n”,avg);
}
6.下列程序完成3个操作。(1)输入10个字符串(每串不多于9个字符),依次放在a数组中,指针数组str中的每个元素依次指向每个字符串的开始。(2)输入每个字符串。(3)从这些字符串中选出最小的那个串输出。
main(){
char a[100],*str[10],*sp;
int i,k;
sp=a;
for(i=0;i<10;i++)
{scanf(“%s”,sp);
str[i]= ;
k=strlen(sp);
sp+= ;
}
k=0;
for(i=0;i<10;i++)
if (strcmp(str[i],str[k]) ) k=I;
;
}
7.下面程序把数组元素按相反的顺序进行存放。
void inv(int *x,int n)
{ int *i,*j,t;
for(i=x,j=x+n-1; (1) ;i++,j--)
{t=*i;*i=*j;*j=t;}
}
main(){
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf(“The old array is:\n”);
for(i=0;i<10;i++)
printf(“%-6d”,a[i]);
printf(“\n”);
(2) ;
printf(“after reveser:\n”);
for(i=0;i<10;i++)
printf(“%-6d”,a[i]);
printf(“\n”);
}
8.用指针法求出数组中的最大元素与最小元素。
int max,min;
void max_min_value(int array[],int n){
int *p;
(1) ;
for( (2) ;pif(*p>max)
max=*p;
else
if (*pmin=*p;
}
main(){
int i,number[10],*p;
p=number;
printf(“input 10 number:\n”);
for(i=0;i<10;i++,p++)
scanf(“%d”,p);
(3) ;
max_min_value(p,10);
printf(“max=%10d min=%d\n”,max,min);
}
9.把字符串按从小到大的顺序输出。
void sort( (1) ,int n){
int i,j,k;
char *temp;
for(i=0;i<=n-1;i++)
{ k=i;
for(j=i+1;j<=n;j++)
if ( (2) ) k=j;
if(k!=i) {temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void print(char *name[],int n){
int i;
for(i=0;iprintf(“%s\n”, (3) );
}
main(){
char *name[]={“Nanhua”,”Central South”,”HuNan”,”HuBei”};
sort(name,4);
print(name,4);
}
四、编程题
1.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数)凡报到3的人退出圈子,问最后留下的那位是原来的第几号。
2.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少?
3.输入一个字符串,内有数字和非数

字字符,如:a123x456=4567?45at587将其中连续的数字作为一个整数,依次存放到数组a中。例如:123存放在a[0],456存放在a[1]……统计共有多少个整数,并输出这些数。

第9章 结构和其他数据机制
一、选择题
1.有定义如下:
struct sk
{ int a;
float b;
}data,*p;
如果p=&data;则对于结构体变量data的成员a的正确引用是( )。
A.(*).data.a B.(*p).a C.p->data.a D.p.data.a
2.已知:
struct st
{ int n;
struct st *next;
};
static struct st a[3]={1,&a[1],3,&a[2],5,&a[0]},*p;
如果下述语句的显示是4,则对指针p的赋值是()。
printf(“%d”,++(p->next->n));
A.p=&a[0]; B. p=&a[1]; C. p=&a[2]; D. p=&a[3];
3.已知:
struct
{ int k;
char c;
float a;
}test;
则sizeof(test)的值是()
A.4 B. 5 C. 6 D. 7
4.若有以下定义和语句:
union data
{ int k;
char c;
float f;
}a;
int n;
则以下语句正确的是( )
A.a=5 B. a={2,’a’,1.2} C. printf(“%d\n”,a) D.n=a;
5.已知:
struct sk
{ int a;
int age;
}data,*p;
如果要使指针p指向data中的成员a,正确的赋值语句是( )
A.p=(struct sk*)&data.a; B.p=(struct sk *)data.a;
C.p=&data.a; D.p=data.a;
6.已知enum week {sun,mon,tue,wed,thu,fri,sat} day;则正确的赋值语句是( )
A.sun=0; B. sat=day; C. sun=mon; D.day=sun;
7.下面程序的运行结果是( )
main(){
struct cmplx
{ int x;
int y;
}cnum[2]={1,3,2,7};
printf(“%d\n”,cnum[0],y/cnum[0].x*cnum[1].x);
}
A. 0 B. 1 C. 3 D.6
8.设有如下定义( )
struct sk
{ int n;
float x;
}data,*p;
若要使p指向data中的n域,正确的赋值语句是( )
A.p=(struct sk*)&data.n; B.p=(struct sk *)data.n;
C.p=&data.n; D.*p=data.n;
9.以下对结构体变量stu1中成员age的非法引用是( )
struct student
{ int age;
int num;
}stu1,*p;
p=&stu1;
A. stu1.age B.student.age C.p->age D.(*p).age
10.以下scanf函数调用语句中对结构体变量成员的不正确引用是( )
struct pupil
{ char name[20];
int age;
int sex;
}pup[5],*p;
p=pup;
A.scanf(“%s”,pup[0].name); B. scanf(“%d”,&pup[0].age);
C. scanf(“%d”,&(p->sex)); D. scanf(“%d”,p->age);
二、填空题
1.下面程序的功能是输入学生的姓名和成绩,然后输出。
struct strinf
{char name[20];
int score;
}stu,*p;
main(){
p=&stu;
printf(“Enter name:”);
gets( (1) );
printf(“enter score:”);
scanf( (2) );
printf(“output:%s,%d\n”, (3) , (4) );
}
2.下面程序段的功能是统计链表中节点的个数,其中first为指向第一个节点的指针(链表不带头节点)。请在 内填入正确内容。
struct link
{char data;
struct link *next;
};

struct link *p,*first;
int c=0;
p=first;
while( )


{ ;
p= ;
}
三、编程题
1.编写程序:input和output函数输入/输出5个学生的记录,其中每个学生包括学号(char num[6])、姓名(char name[8])、4门课的分数(score)信息。
2.现有如下一个结构体,编程实现找到年龄最大的人,并输出。
static struct man{
char name[20];
int age;
}person[N]={“li”,18,”wang”,19,”zhang”,20,”sun”,22};
3.编写程序:有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,3门课成绩),计算出平均成绩。


相关文档