习题十 指针
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]);}
程序运行后的输出结果是______。
A、2,2,3,4,5, B、6,2,3,4,5, C、1,2,3,4,5, D、2,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读入数据并输出,但程序有多处错误,以下语句正确的是______。
A、int n , *p=NULL; B、*p=&n; C、scanf("%d",&p) D、printf("%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
则程序的输出结果是______。
A、3 B、5 C、7 D、11
解析:本题考查的是带有参数的main函数。main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为一个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv(1)、argv(2)、argv(3)指向的字符串(123、45、67)的长度并把他们加到变量n中,得到n的值为7。 故本题答案为C。
4. 若有以下函数首部
int fun(double x[10], int *n)
则下面针对此函数的函数声明语句中正确的是______。
A、int fun(double x, int *n); B、int fun(double, int );
C、int fun(double *x, int n); D、int fun(double *, int *);
解析:本题考查的是函数的声明。函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。字符数组可用指针来表示,所以选项D正确。故本题答案为D。
5. 有以下程序
main()
{char s[]={"aeiou"},*ps;
ps=s; printf("%c\n",*ps+4); }
程序运行后输出的结果是______。
A、a B、e C、u D、元素s[4]的地址
解析:本题考查的是指针变量的运算。此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps +4相当于先从指针变量ps指向的地址中取出相应数据"a"后,对此数据加4,a的ASCII码为32,32+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");}
程序运行后输出的结果是______。
A、6 7 8 9 10 B、1 3 5 7 9 C、1 2 3 4 5 D、6 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]的值分别为6、7、8、9、10。 故本题答案为A。
7. 有以下程序
int add (int a, int{return(a+b); }
main ()
{int k,(*f)(),a=5,b=10;
f=add; …}
则以下函数调用语句错误的是______。
A、k=(*f)(a,b); B、k=add(a,b); C、k=*f(a,b); D、k=f(a,b);
解析:此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项A、D的形式)调用即可, 而选项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);}
执行后的输出结果是______。
A、1 B、2 C、3 D、4
解析:本题考查的是通过指针引用数据进行计算。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++;后,下列说法错误的是______。
A、p向高地址移了一个字节 B、p向高地址移了一个存储单元
C、p向高地址移了两个字节 D、p与a+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);}
程序执行后的输出结果是______。
A、123,abc B、abc,123 C、1bc,a23 D、321,cba
解析:本题考查的是指针变量值的交换。C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*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);}
程序执行后的输出结果是______。
A、Prohsbn B、Prphsbn C、Progsbn D、Program
解析:本题考查的是指向数组的指针作为函数的参数及指针的运算。如果形参数组中的元素发生变化,实参也将发生相应变化。指针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小时内删除。
发表评论