• 东北大学acm暑期夏令营指针与引用初步


    NEUQ-ACM-CAMP-B010-指针与引用初步
    NEUQ-ACM-CAMP-B010-指针与引用初步
    开始时间 2022/08/16 08:00:00
    结束时间 2022/08/31 23:59:00
    答题时长 22559分钟
    答卷类型 标准答案
    总分 100

    单选题 得分:暂无 总分:36
    2-1

    下列对变量的引用中错误的是____。

    (2分)
    A.

    int a; int &p = a;

    B.

    char a; char &p = a;

    C.

    int a; int &p; p=a;

    D.

    float a; float &p = a;


    2-2

    若有说明:int n=2,*p=&n,*q=p,则以下非法的赋值语句是: ( )。

    (2分)
    A.

    p=q

    B.

    *p=*q

    C.

    n=*q

    D.

    p=n


    2-3

    变量的指针是指变量的( )。

    (2分)
    A.

    B.

    地址

    C.

    D.

    内存单元


    2-4

    若有语句“int i , j=7 , *p=&i; ”,则与“i=j; ”等价的语句是( )。

    (2分)
    A.

    i=*p;

    B.

    *p=j

    C.

    i=&j;

    D.

    i=**p;


    2-5

    int a=3, *p=&a;中,*p的值是( ) 。

    (2分)
    A.

    &a

    B.

    无意义

    C.

    &p

    D.

    3


    2-6

    下列语句定义x为指向int类型变量a的指针,正确的是( )。

    (2分)
    A.

    int a,*x=a

    B.

    int a,*x=&a

    C.

    int *x=&a,a

    D.

    int a,x=a


    2-7

    若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。

    (2分)
    A.

    p++

    B.

    x++

    C.

    *(p++)

    D.

    &x++


    2-8

    若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ____是正确的。

    (2分)
    A.

    p2=p1

    B.

    p2=**p1

    C.

    p2=&p1

    D.

    p2=*p1


    2-9

    根据声明int a[10], *p=a; ,下列表达式错误的是( )。

    (2分)
    A.

    a[9]

    B.

    p[5]

    C.

    a++

    D.

    *p++


    2-10

    下列关于引用的说法,错误的是____。

    (2分)
    A.

    引用在定义时必须初始化

    B.

    引用在初始化时不能绑定常量值

    C.

    引用初始化后,可以通过更变来引用其他变量

    D.

    数组不能定义引用


    2-11

    若定义pf为指向float类型变量f的指针,下列语句中__是正确的。

    (2分)
    A.

    float f, *pf = f;

    B.

    float f, *pf = &f;

    C.

    float *pf = &f, f;

    D.

    float f, *pf =0.0;


    2-12

    下面程序段 int a=1,b=2; int &r=a; r=b; r=7; cout<

    (2分)
    A.

    1

    B.

    2

    C.

    7

    D.

    无法确定


    2-13

    ( )是给变量取一个别名,引入了变量的同义词。

    (2分)
    A.

    枚举

    B.

    指针

    C.

    引用

    D.

    结构


    2-14

    已知:float b = 34.5; ,则下列表示引用的方法中,正确的是( )。

    (2分)
    A.

    float &x = b;

    B.

    float &y = 34.5;

    C.

    float &z;

    D.

    int &t = &b;


    2-15

    若有说明:int *p,m=5,n;以下正确的程序段是( )。

    (2分)
    A.

    p=&n;
    scanf("%d",&p);

    B.

    p=&n;
    scanf("%d",*p);

    C.

    scanf("%d",&n);
    *p=n;

    D.

    p=&n;
    *p=m;


    2-16

    设有定义int a=3, b, *p=&a;,则下列语句表达有错的是

    (2分)
    A.

    b = *&a;

    B.

    b = *a;

    C.

    b = *p;

    D.

    b = a;


    2-17

    如果已经定义int x;,则对指针变量pointer进行说明和初始化正确的是

    (2分)
    A.

    int pointer = &x;

    B.

    int *pointer = *x;

    C.

    int pointer = x;

    D.

    int *pointer = &x;


    2-18

    下列不正确的定义是(    )。

    (2分)
    A.

    int *p=&i,i;

    B.

    int *p,i;

    C.

    int i,*p=&i;

    D.

    int i,*p;


    程序填空题 得分:暂无 总分:64
    5-1

    小可爱们,咱们来做一个简单的计算器:输入两个整数,输出它们的和。

    #include 
    int main()
    {
        int a,b;
        scanf("%d%d",(2分)); //输入a,b
        printf("%d\n",(2分));//输出和
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    小可爱们,这次使用scanf函数输入时,有没有忘记在变量前面加&符号?

    为什么使用scanf函数变量前面要加&,printf函数变量前面不加&,这个&符号是什么作用呢?
    咱们先看下面图片中编译器的输出。

    指针出题1.png

    小伙伴们,你发现了么?变量其实同时有地址和值两个属性,它的数据值,存储在某个内存地址中,这个值被称为变量的右值。我们也可认为右值的意思是被读取的值。它的地址值,即存储数据值的那块内存的地址,被称为变量的左值。

    我们一般用一个变量,都是直接写一个名字,其实如果这个名字在赋值号右边,就是代表右值,也就是变量的值,如果在赋值号左边,就是代表左值,即代表变量的地址,写出来一样,意义是不一样的,编译器自动帮我们选择了正确的意义。

    回到我们第一个问题:为什么使用scanf函数变量前面要加&,printf函数变量前面不加&?

    因为scanf要变量里写入数值,所以它必须知道那个变量的地址,至于变量里存的是什么值,它是不关心的,反正写入之后就被覆盖成新的值了。
    对比printf,是要输出变量里的数值,它只管要那个值,至于地址在哪,它也无所谓。

    而变量名字写在函数参数里面时,和写在赋值号右边一样,也是代表值,可是像scanf这种函数,它确实需要地址,编译器只认为在赋值符左边的才是左值,那在scanf函数里,没法自动获得左值,这时就需要我们手动加一个取地址运算符&,明确告诉编译器去获取变量的地址给这scanf来用。

    再仔细看看上面的图片,我们会发现这里的&a是int ∗*类型,a是int类型。&其实是取地址运算符,&a得到的就是变量a分配的内存地址。&a表达式的值是地址,所以咱们在编译器里看到&a是int ∗*类型,即指针类型。

    类似的,我们可以使用下面语句定义一个指针变量:

    int *p;
    
    • 1

    和普通变量不同,指针变量赋值必须指向一个已经分配的内存地址,例如:

    int a = 2;
    int *p = &a;
    
    • 1
    • 2

    我们定义了一个变量a,其值为2。我们又定义了一个指针变量p(这里的∗*是指针变量定义符号),将其初始化为变量a的地址。
    如果我们想使用指针变量p来修改变量a的值要怎么做呢?使用指针运算符,如下:

    *p = 3;
    
    • 1

    这里的∗*是运算符。因为p是a的地址(p指向变量a),∗*p就是访问p指向的对象,∗*p赋值为3,就是a赋值为3。


    5-2

    请完善程序,实现以下程序功能:从键盘上输入两个整数,通过指针将两个数按照升序排序,最后输出结果。
    输入样例1:

    -99 99

    输出样例1:

    -99 99

    输入样例2:

    99 -99

    输出样例2:

    -99 99

    #include 
    int main(void)
    {int k;for(k=1;k<=3;k++){ //该循环用于自动阅卷,请考生忽略
     int i,j,(2分),t;
     p=(2分);  //使得p指向变量i
     q=(2分);  //使得q指向变量j
     scanf("%d%d",p,q); //输入两个整数,存入变量i、j中
     if(*p(2分)*q) //比较变量i、j的值
      { t=*p;
        (2分)
        *q=t;
       }
      printf("%d %d\n",i,j);
     } //该循环用于自动阅卷,请考生忽略
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5-3

    请完善程序,实现以下程序功能:从键盘上输入3个整数,使用指针实现升序排序,最后输出结果。

    输入样例1:

    1 -6 99

    输出样例1:

    -6 1 99

    输入样例2:

    99 1 -6

    输出样例2:

    -6 1 99

    输入样例3:

    -6 99 1

    输出样例3:

    -6 1 99

    //本程序的基本算法:首先将3个数中最小的数存放在变量a中;然后,将次最小数存放在变量b中;
    //变量c中存放的自然是最大数;至此,3个数按由小到大的顺序排好。
    
    • 1
    • 2

    #include
    int main(void)
    {int k;for(k=1;k<=6;k++){ //该循环用于自动阅卷,请考生忽略
    int a,b,c,*p,*q,*r,t;
    //指针变量p,q,r分别指向变量a,b,c
    p=&a;
    q=&b;
    r=(2分);
    scanf(“%d%d%d”,p,q,r); //输入3个整数存入变量a,b,c中
    if(*p>*q) //将变量a,b中较小的数存放在a中
    {t=*p;
    (2分);
    *q=t;
    }
    if((2分)) //将变量a,c中较小的数存放在a中
    {t=*p;
    *p=*r;
    *r=t;
    }
    if(*q>*r) //将变量b,c中较小的数存放在b中
    {(2分);
    *q=*r;
    *r=t;
    }
    printf(“%d %d %d\n”,*p,(2分),*r); //输出排好序的3个数
    } //该循环用于自动阅卷,请考生忽略
    return 0;
    }


    5-4

    请完善程序,实现以下程序功能:从键盘上输入4个整数,通过间接引用方式找出其中的最小数并输出。

    输入样例1:

    -999 5 8 2

    输出样例1:

    min=-999

    输入样例2:

    8 5 -999 2

    输出样例2:

    min=-999

    输入样例3:

    8 2 5 -999

    输出样例3:

    min=-999

    //本程序基本算法:首先假设变量a的值最小,将其保存到变量min中
    //然后,将变量b,c,d的值依次与min进行比较
    //将较小的值赋给min
    //比较3次后,得到4个数中的最小数min
    #include 
    int main(void)
    {int k;for(k=1;k<=4;k++){ //该循环用于自动阅卷,请考生忽略
    int a,b,c,d,*p1,*p2,*p3,*p4,min;
     //使得指针变量p1,p2,p3,p4分别指向变量a,b,c,d
     p1=&a;
     p2=(2分);
     p3=&c;
     p4=(2分);
     scanf("%d%d%d%d",p1,p2,(2分));  //输入4个整数,并依次存入变量a,b,c,d中
     min=*p1;  //将变量a的值赋给min
     if((2分))  //将变量b的值与min的值进行比较
        min=*p2;
     if(*p3
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    5-5

    请完善程序,实现以下程序功能:已知斐波那契数列的前两项均为1,从第3项开始,每一项的值为其前面两项之和。下面程序的功能为使用指针依次计算出斐波那契数列的前20项并保存到数组a中,然后再顺序输出。

    输出样例:

    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

    #include 
    int main(void)
    {int f[20],i,*p1,*p2,*p3;
     f[0]=1;
    (2分);  //第2项赋值
    //在下面的循环中,指针p1,p2,p3依次存储f[i-2],f[i-1],f[i]的地址
     for(i=2;(2分);i++)
        {p1=&f[i-2];
         p2=(2分);  //使得p2指向相应的数组元素
         p3=&f[i];
         *p3=(2分);  //求出下一项的值
        }
     p1=f;//指针p1存储数组f的首地址
     for(i=0;i<=19;i++)  //依次输出数列的前20项
        {printf("%d ",*p1);
         (2分);  //调整指针变量p1的值,指向下一个数组元素
        }
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5-6

    编写程序,从键盘上输入任意两个整数,输出它们的和值与差值之积(用指针实现)。

    #include 
    int main()
    {
        int a,b,s;
        int *pa=&a,*pb=&b,*ps=&s;
        scanf("%d%d",(3分));
        *ps=(*pa + *pb)*(*pa - *pb);
        printf("(3分)\n",(4分) );
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5-7

    编写程序,输入一个数字字符,将其转化为数字并输出(用指针实现)。

    #include 
    int main()
    {
        char c,*pc;
        int d,*pd;
        pc=(2分);
        pd=(2分);
        *pc=getchar();  //输入数字字符
        *pd=(4分);    //转化为数字
        printf("%d\n",(2分) );  //输出数字
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

  • 相关阅读:
    Django的学习笔记
    Effective Java学习笔记---------方法
    20220823 c++
    golang的interface转float
    如何做 React 性能优化?
    设计模式 -- 策略模式(Strategy Pattern)
    14.cuBLAS开发指南中文版--cuBLAS中的Level-1函数nrm2()和rot()
    YOLOV7详细解读(四)训练自己的数据集
    Linux自用命令
    浅析Jetty与tomcat区别
  • 原文地址:https://blog.csdn.net/qq_60755115/article/details/126542361