加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

指针练习题

(2011-06-05 23:23:55)
标签:

指针

杂谈

分类: 信息学竞赛

pointer1

(一)选择题

1.若有以下定义,则对a数组元素的正确引用是_________.

 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列元素地址的正确引用为______.

  a)*(a[i]+j)   b)(a+i)   c)*(a+j)  d)a[i]+j

 

3.若有以下定义,则p+5表示_______.

  int  a[10],*p=a;

  a)元素a[5]的地址             b)元素a[5]的值

  c)元素a[6]的地址             d)元素a[6]的值

 

4.下面程序段的运行结果是_________.

  char *s="abcde";

  s+=2;printf("%d",s);

  a)cde     b)字符'c'     c)字符'c'的地址     d)无确定的输出结果

 

5.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确

执行的赋值语句是________.

a)c=*p1+*p2;    b)p2=c    c)p1=p2      d)c=*p1*(*p2);

 

6.以下正确的程序段是_________.

  a)char str[20];                    b)char *p;

    scanf("%s",&str);                  scanf("%s",p);

  c)char str[20];                    d)char str[20],*p=str;

    scanf("%s",&str[2]);               scanf("%s",p[2]);

 

7.若有说明语句

   char a[]="It is mine";

   char *p="It is mine";

  则以下不正确的叙述是________.

  a)a+1表示的是字符t的地址

  b)p指向另外的字符串时,字符串的长度不受限制

  c)p变量中存放的地址值可以改变

  d)a中只能存放10个字符

 

8.下面程序的运行结果是_______.

  #include  <stdio.h>

  #include  <string.h>

  main()

  {

    char *s1="AbDeG";

    char *s2="AbdEg";

    s1+=2;s2+=2;

   printf("%d\n",strcmp(s1,s2));

  }

  a)正数    b)负数   c)零   d)不确定的值

 

9.下面程序的运行结果是_______.

  #include  <stdio.h>

  #include  <string.h>

  fun(char *w,int n)

   {char t,*s1,*s2;

    s1=w;s2=w+n-1;

    while(s1<s2){t=*s1++;*s1=*s2--;*s2=t;}

  }

  main()

{char *p;

  p="1234567";

  fun(p,strlen(p));

  puts(p);

  }

 

a)7654321   b)1714171   c)1711717   d)7177171

10.变量的指针,其含义是指该变量的_________.

  a)值              b)地址

  c)名              d)一个标志

 

11.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_____.

  a)a,point,*&a             b)&*a,&a,*point

  c)*&point,*point,&a       d)&a,&*point ,point

 

12.若有说明;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;

 

(二)填空题

1.以下程序的功能是:通过指针操作,找出三个整数中的最小值并输出。

请填空。

  #include "stdlib.h"

  main()

  {int *a,*b,*c,num,x,y,z;

   a=&x;b=&y;c=&z;

   printf("输入3个整数:");

   scanf("%d%d%d",a,b,c);

   printf("%d,%d,%d\n",*a,*b,*c);

   num=*a;

   if(*a>*b)______;

   if(num>*c)______;

   printf("输出最小整数:%d\n",num);

  }

 

2.下面程序段的运行结果是________.

  char s[80],*sp="HELLO!";

  sp=strcpy(s,sp);

  s[0]='h';

  puts(sp);

 

3.下面程序段的运行结果是________.

  char str[]="abc\0def\0ghi",*p=str;

  printf("%s",p+5);

 

4.下面程序的功能是将两个字符串s1和s2连接起来。请填空。

   #include<stdio.h>

  main()

  {char s1[80],s2[80];

  gets(s1); gets(s2);

   conj(s1,s2);

   puts(s1);

  }

  conj(char *p1,char *p2)

    {char *p=p1;

   while(*p1)______;

   while(*p2){*p1=______;p1++;p2++;}

   *p1='\0';

   __________;

  }

 

5.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______. *(a+5)的值是_________.

6.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____. *(*(a+1)+0))的值是________.

7.以下程序将数组a中的数据按逆序存放,请填空。

  #define M 8

  main()

  {int a[M],i,j,t;

   for(i=0;i<M;i++)scanf("%d",a+i);

   i=0;j=M-1;

   while(i<j)

    {

     t=*(a+i);________;*(_______)=t;

     i++;j--;

     }

  for(i=0;i<M;i++)printf("=",*(a+i));

 }

 

8.若有定义:int a[3][5],i,j;(且0<=i<3,0<=j<5),则a数组中任一元素可用

五种形式引用。它们是:

  (1)a[i][j]

  (2)*(a[i]+j)

  (3)*(*______);

  (4)(*(a+i))[j]

   (5)*(____+5*i+j)

 

9.下面程序的运行结果是_________.

  main()

  {char *a[]={"Pascal","C language","dBase","Coble"};

   char (**p)[];

   int j;

   p=a+3;

   for(j=3;j>=0;j--)printf("%s\n",*(p--));

  }

 

 

(三)程序设计题(要求用指针的方法完成)

1.编写程序,交换数组a和数组b中的对应元素。

2.有10个数围成一圈,求出相邻三个数之和的最小值。

3.产生动态数组。输入数组大小后,通过动态分配内存函数malloc产生数组。

4.编写程序,将一个字符串反向存放。

5.输入一串英文文字,统计其中字母(不区分大小写)的数目。

 

pointer2

1、please check out which of the following statements are wrong?

#include <iostream>                   1

using namespace std;                   

int main() {                           3

int iv;                            4

int iv2 = 1024;                    5

int iv3 = 399;                     6

int &reiv;                         7

int &reiv2 = iv;                   8

int &reiv3 = iv;                   9

int *pi;                           10

*pi = 5;                           11

pi = &iv3;                         12

const double di;                    13

const double maxWage = 10.0;        14

const double minWage = 0.5;         15

const double *pc = &maxWage;        16

cout << pi;                         17

return 0;                           18

                               19

 

2、这个程序有什么问题?该如何修改? 

char *strA() {

char str[] = “Hello World”;

return str;

}

3、What results after run the following code ?

#include <stdio.h>

int main() {

    int *ptr;

    ptr = (int *)0x8000;

    *ptr = 123;

   return 0;

}

4、下面程序会在哪一行崩溃?

#include <stdio.h>

struct S {

    int i;

    int *p;

};  

int main() {   

    S s;

    int *p = &s.i;

    p[0] = 4;

    p[1] = 3;

    s.p = p;

    s.p[1] = 1;

    s.p[0] = 2;

    return 0;

}

5、设有以下定义:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a, * p=a[0];
则下列能够正确表示数组元素a[1][2]的表达式是
*((*prt+1)[2])

*(*(p+5))

(*prt+1)+2

*(*(a+1)+2)

6、解释a的输出结果。
int (*a)[10];
a++;

 

7、#include <stdio.h> 

int main() {   

    int v[2][10];

    int (*a)[10] = &v[0];

    int (*tmp)[10] = a;

    a++;

    printf("%d\n", (int)a - (int)tmp);

   return 0;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有