【PTA选择题/基础巩固/期末复习】指针(一)

文章详细解释了C语言中指针的概念,包括指针与数组元素的关系、指针的自增操作、赋值语句以及函数参数传递。涉及了指针算术、数组地址计算和函数作用域的示例问题。
摘要由CSDN通过智能技术生成

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

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值