习题十  指针
1. 有以下程序
void f(int  *q)
{  int i=0;
  for( ;i<5;i++) (*q)++;}
main()
{  int a[5]={1,2,3,4,5},i;
  f(a);
  for(i=0;i<5;i++) printf("%d,",a[i]);}
程序运行后的输出结果是______
A2,2,3,4,5, B6,2,3,4,5,  C1,2,3,4,5, D2,3,4,5,6,
解析:本题考查的是指针作为函数的参数和函数的调用。题目中定义了一个指针变量作为函数f()指针函数的作用的形参。主函数main()中调用f()函数,当i=0时,执行语句(*q)++,此处*q代表的就是数组元素a[0]的值,即将1进行加1操作;当i=1时,q仍指向数组元素a[0]的地址,因为在函数f()中并未对指针变量q作任何变动,也即*q仍代表了数组元素a[0]的值,所以此次(*q)++2+1,所以a[0]的值变为3;……直到i=4时,执行(*q)++(即5+1)后a[0]的值变为6。所以最后的输出结果为:6,2,3,4,5,。故本题答案选B
2. 有以下程序
#include  <stdio.h>
main()
{ int  n, *p=NULL;
  *p=&n; printf("Input n:");
  scanf("%d",&p);  printf("output n:");  printf("%d\n",p);}
该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是______
Aint  n , *p=NULL; B*p=&n; Cscanf("%d",&p) Dprintf("%d\n",p);
解析:本题考查的是指针的赋值。*p代表存储单元的值,而&n代表的是变量n的地址,将一个地址赋给一个值是不正确的,所以选项B错误;指针p代表存储单元的地址,前面不需要再加&,所以选项C错误;选项D是将一个地址进行输出,所以也是错误的。除了给指针变量赋地址值外,还可以给指针变量赋NULL值,选项A正确。故本题答案选A
3. 有以下程序
#include  <string.h>
main(int  argc,  char  *argv [])
{int  i=1,n=0;
  while(i<argc) {n=n+strlen(argv[i]);i++;}
  printf("%d\n",n);
}
该程序生成的可执行文件名为:。若运行时输入命令行:
proc  123  45  67
则程序的输出结果是______
A3   B5   C7   D11
  解析:本题考查的是带有参数的main函数。main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为一个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv(1)argv(2)argv(3)指向的字符串(1234567)的长度并把他们加到变量n中,得到n的值为7 故本题答案为C
4. 若有以下函数首部
int  fun(double  x[10], int  *n)
则下面针对此函数的函数声明语句中正确的是______
Aint  fun(double x, int *n);   Bint  fun(double, int );
Cint  fun(double *x, int n);  Dint  fun(double *, int *);
  解析:本题考查的是函数的声明。函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。字符数组可用指针来表示,所以选项D正确。故本题答案为D
5. 有以下程序
main()
{char  s[]={"aeiou"},*ps;
ps=s;  printf("%c\n",*ps+4); }
程序运行后输出的结果是______
Aa   Be   Cu   D、元素s[4]的地址
  解析:本题考查的是指针变量的运算。此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps +4相当于先从指针变量ps指向的地址中取出相应数据"a"后,对此数据加4aASCII码为3232+4=36,对应于字符e 故本题答案选B
6. 有以下程序
void change(int k[]){ k[0]=k[5]; }
main()
{  int  x[10]={1,2,3,4,5,6,7,8,9,10}, n=0;
  while(n<=4) 
  { change(&x[n]); n++;}
  for(n=0;n<5;n++)  printf("%d",x[n]);
    printf("\n");}
程序运行后输出的结果是______
A6 7 8 9 10    B1 3 5 7 9   C1 2 3 4 5  D6 2 3 4 5
  解析:本题考查的是数组名作函数参数。当n=0时,把x[0]的地址传给被调函数change,即将形参k与实参x指向同一个存储单元x[0],执行被调函数后,k[0]=6,即x[0]=6;当n=1时,形参k指向x数组的第1个数组元素所在单元,即k[0]x[1]共用同一存储单元,执行被调函数后,k[0]=7,即x[1]=7,依次类推得出x[0]x[4]的值分别为678910 故本题答案为A
7. 有以下程序
int add (int  a, int{return(a+b); }
main ()
{int  k,(*f)(),a=5,b=10;
f=add;}
则以下函数调用语句错误的是______
Ak=(*f)(a,b);   Bk=add(a,b);   Ck=*f(a,b);   Dk=f(a,b);
  解析:此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项AD的形式)调用即可, 而选项C中是先进行函数调用,然后对调用后返回的整型值求其指针值,是不合理的。故本题答案为C
8. 有以下程序
main()
{ int  a=1,b=3,c=5;
  int  *p1=&a,*p2=&b,*p=&c;
  *p=*p1*(*p2);
  printf("%d\n",c);}
执行后的输出结果是______
A1   B2   C3   D4
  解析:本题考查的是通过指针引用数据进行计算。p1=&a表示指针变量p1指向元素1的地址; p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址; 执行*p=*p1*(*p2)=1*3=3,所以最后的结果为:3 故本题答案为C
9. 在16位编译系统上,若有定义 int  a[]={10,20,30},*p=&a;,少逗号当执行p++;后,下列说法错误的是______
Ap向高地址移了一个字节    Bp向高地址移了一个存储单元
Cp向高地址移了两个字节    Dpa+1等价
    解析:本题考查的是指针的应用。题目中p=&a表示指针p指向第一个元素a[0],执行p++是指使p指向下一个数据对象的地址,也就是向高地址移了一个存储单元;因为int数据占两个字节,所以p相当于向高地址移了两个字节,所以选项A错误。 故本题答案为A
10. 有以下程序
void swap(char *x,char *y)
{ char t;
  t=*x;*x=*y;*y=t;}
main()
{ char *s1="abc",*s2="123";
  swap(s1,s2); printf("%s,%s\n",s1,s2);}
程序执行后的输出结果是______
A123,abc  Babc,123  C1bc,a23   D321,cba
  解析:本题考查的是指针变量值的交换。C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针xy指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x*y交换的是字符串的第一个字符,即字符"a""1"的交换,而字符串中其它字符保持不变。故本题答案为C
11. 有以下程序
void fun1(char *p)
{ char *q;
  q=p;
  while(*q!= '\0')
  {(*q)++;q++;}}
main()
{ char a[]={"Program "},*p;
  p=&a[3];fun1(p); printf("%s\n",a);}
程序执行后的输出结果是______
AProhsbn  BPrphsbn   CProgsbn   DProgram
  解析:本题考查的是指向数组的指针作为函数的参数及指针的运算。如果形参数组中的元素发生变化,实参也将发生相应变化。指针p指向数组的第三位地址(即字符"g"的地址),q=p也就相当于指针q指向数组的第三位地址。表达式(*q)++,首先根据()的优先级得到a[3]的值"g",再进行加1运算,所以g也就变成了h;表达式q++是将地址加1,也就是指向下一个地址a[4]。然后再执行while()语句,直到遇到'\0'结束循环,返回形参。故本题答案为A
12. 有以下程序
main()
{ char *p[]={"3697","2548"};
  int i,j;  long num=0;
  for(i=0;i<2;i++)
  { j=0;
    while(p[i][j]!= '\0')
    { if((p[i][j]- '0')%2) num=10*num+p[i][j]- '0';
      j+=2; }}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。