2-1
若已定义:int b=12,*p=&b;下列叙述错误的是( )。
A.*(&p)等价于b
B.&(*p)等价于p
C.*p等价于b
D.b等价于*(&b)
2-2
若已定义:int a[5]={1,2,3,4,5},*p=a;且p值未发生变化,下列不能表示a[1]地址的是( )。
A.p+1
B.a+1
C.a++
D.++p
2-3
若已定义:int a[5]={1,2,3,4,5},*pa=a;下列叙述错误的是()。
A.a[2]与pa[2]的值相等
B.*(pa+2)与a[2]的值相同
C.pa与a的值相等
D.a++与pa++的作用相同
解析:a++和pa++都是对指针进行自增操作,但它们作用的对象不同。a是数组名,进行自增操作没有意义;而pa是指针,自增操作会使其指向下一个元素。所以a++与pa++的作用不相同
2-4
若有定义“int n1=0, n2, *p=&n2, *q=&n1;”, 则与赋值语句“n2=n1”等价的是()。
A.*p=*q;
B.p=q;
C.*p=&n1;
D.p=*q;
2-5
设有定义“int a[10] ={1, 2, 3, 4, 5, 6,7, 8, 9, 10}, *p = &a[3], b;”, 则执行语句“b=p[5];”后变量b的值为()。
A.5
B.6
C.8
D.9
2-6
执行以下程序段的输出结果是( )。
int a=10,*p=&a;
printf("%d",++*p);
A.10
B.11
C.变量a的地址
D.变量a的地址 + 1
2-7
若有定义:int *p,a=4; p=&a;则以下均代表地址的是
A.a,p
B.&a,p
C.&a,*p
D.a,*p
2-8
下面程序输出数组中的最大值,由s指针指向该元素
int main()
{
int a[10]={6,7,2,9,1,10,5,8,4,3,},*p,*s;
for(p=a, s=a; p-a<10; p++)
if( ---?--- )
s=p;
printf("The max:%d",*s):
return 0;
}
则在if语句中的判断表达式应该是:
A.p>s
B.*p>*s
C.a[p]>a[s]
D.p-a>p-s
2-9
以下程序的输出结果是:
#include<stdio.h>
void sub1(char a,char b)
{
char c;
c=a;
a=b;
b=c;
}
void sub2(char* a,char b)
{
char c;
c=*a;
*a=b;b=c;
}
void sub3(char* a,char*b)
{
char c;
c=*a;
*a=*b;
*b=c;
}
int main()
{
char a,b;
a='A';b='B';sub3(&a,&b);putchar(a);putchar(b);
a='A';b='B';sub2(&a,b);putchar(a);putchar(b);
a='A';b='B';sub1(a,b);putchar(a);putchar(b);
return 0;
}
A.BABBAB
B.ABBBBA
C.BABABA
D.BAABBA
2-10
执行以下程序后,y的值是:
int main ( )
{
int a[]={2,4,6,8,10};
int y=1,x,*p;
p=&a[1];
for(x=0;x<3;x++)
y + = * (p + x);
printf("%d\n",y);
return 0;
}
A.17
B.18
C.19
D.20
2-11
若有说明: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;
2-12
下列不正确的定义是( )。
A.int *p=&i,i;
B.int *p,i;
C.int i,*p=&i;
D.int i,*p;
2-13
若有说明:int n=2,*p=&n,*q=p,则以下非法的赋值语句是: ( )。
A.p=q
B.*p=*q
C.n=*q
D.p=n
2-14
若有说明语句“int a[5],*p=a;”,则对数组元素的正确引用是( )。
A.a[p]
B.p[a]
C.*(p+2)
D.p+2
2-15
有如下程序
int a[10]={1,2,3,4,5,6,7,8,9,10},*P=a;
则数值为9的表达式是 ()。
A.*P+9
B.*(P+8)
C.*P+=9
D.P+8
2-16
以下程序的输出结果
void 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("%d,%d,%d\n",a,b,c);
}
A.5,2,3
B.-5,-12,-17
C.-5,-12,-7
D.5,-2,-7
2-17
下列数组定义
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为6的表达式是
A.*p+6
B.*(p+6)
C.p+5
D.*p+=5
2-18
以下程序段给数组所有的元素输入数据, 请选择正确答案填入:
int main()
{
int a[10],i=0;
while(i<10)
scanf("%d",__);
return 0;
}
A.a+(i++)
B.&a[++i]
C.a+i
D.&a[i+1]
2-19
下列语句定义x为指向int类型变量a的指针,正确的是( )。
A.int a,*x=a
B.int a,*x=&a
C.int *x=&a,a
D.int a,x=a
2-20
变量的指针,其含义是指该变量的( )。
A.值
B.地址
C.名字
D.一个标志
2-21
设有定义int a=3, b, *p=&a;,则下列语句表达有错的是
A.b = *&a;
B.b = *a;
C.b = *p;
D.b = a;
2-22
如果已经定义int x;,则对指针变量pointer进行说明和初始化正确的是
A.int pointer = &x;
B.int *pointer = *x;
C.int pointer = x;
D.int *pointer = &x;
2-23
设有下列语句,则( )是对a数组元素的不正确引用,其中0≤i<10。
int a[10]={0,1,2,3,4,5,6,7,8,9}, * p=a;
A.p[i]
B.p=a[2]
C.*(p+3)
D.*(a+i)
2-24
下列程序的执行结果是( )。
void fun ( int *p )
{ (*p)++;
}
main( )
{ int a=5;
fun(&a);
printf("%d",a);
}
A.5
B.a
C.6
D.程序有误
2-25
若有语句“int i , j=7 , *p=&i; ”,则与“i=j; ”等价的语句是( )。
A.i=*p;
B.*p=j
C.i=&j;
D.i=**p;
2-26
若有语句“int a[]={1,2,3,4,5}; ”,则关于语句“int *p=a;”的说法正确的是( )。
A.把a[0]的值赋给*p
B.把a[0]的值赋给变量p
C.初始化变量p,使其指向数组a的首元素
D.定义不正确
2-27
若有语句“int a[10]; int *p=a; ”,则以下错误的表达式是( ) 。
A.p=a+5;
B.a=p+a;
C.a[2]=p[4];
D.*p=a[0];
2-28
下列函数的功能为
void fun(int *p1, int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
A.可能造成系统故障
B.交换*p1
和*p2
的地址
C.交换*p1
和*p2
的值
D.正确,但无法改变*p1
和*p2
的值
2-29
请问下列程序的执行结果是( )
void fun(int *p,int n)
{
int i;
for(i=0;i<n;i++)
(*p)++;
}
int main()
{
int a[5]={1,2,3,4,5},i;
fun(a,5);
for(i=0;i<5;i++)
printf("%d ",a[i]);
return 0;
}
A.1 2 3 4 5
B.2 3 4 5 6
C.6 2 3 4 5
D.2 2 4 4 6
2-30
执行下面程序段后,变量a的值为( )。
int a=10,b=1;
int *p=&a;
a=*p+b;
A.12
B.11
C.10
D.编译错误
2-31
下列语句定义px为指向int类型变量x的指针,正确的是( )
A.int x,*px=x;
B.int x,*px=&x;
C.int *px=&x,x;
D.int x, px=x;
2-32
执行下面的程序段后,输出结果为()
int a[10] = {9,8,7,6,5,4,3,2,1,0}, *p = a+5;
printf("%d", p[3]);
A.编译错误
B.2
C.0
D.1
2-33
函数调用程序如下:
void f(int a[], int n)
{
int i;
for(i=0;i<n;i++)
a[i]=i;
}
int main( )
{
int a[100],n=30;
f(a,n);
...
}
相关说法错误的是:
A.f函数头改为int f(int *a, int n),无需其它改变,效果完全一样。
B.main函数中增加 int *p=a;将 f(a,n);改为f(p,n);,效果完全一样。
C.用数组名作f()的参数,则main()中的数组与f()中的数组是同一数组。
D.用数组名作f()的参数,实现了实参与形参双向的值传递。
2-34
以下程序段运行后,输出结果是:
int a[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int *p = a + 3;
printf("%d ", *p);
(*p)++;
printf("%d ", *p);
p++;
printf("%d ", *p);
A.40 50 60
B.40 41 50
C.40 50 51
D.40 41 60
2-35
有以下程序段:
int a[]={10,9,8,7,6,5,4,3,2,1}, *p;
p=a;
printf("%d,%d", *p+9, *(p+9) );
输出结果为( )。
A.1,1
B.19,10
C.19,1
D.19,19