• 第四周指针1 习题


     

    指针

    练习测验, 15 个问题
     
     
     
     第一次错题:5  9 10 15
    第二次错题 :9 10 
    第二次错题 :9 
     
    1
    point
    1。

    现在要字符型的定义指针变量p,以下定义及初始值设置合法的包括哪些?

    char a[] = "abc";

    char p[] = &a;

    char a[] = "abc";

    char *p = a;//正确

    char a[] = "abc";

    char p[] = *a;

    char a[] = "abc";

    char p[] = a;

    1
    point
    2。

    已知int a = 3; 现在我们想输出a的值,即得到输出为 3 。在不考虑代码优美性、易读性的情况下,以下操作可行的有哪些?

    cout << &*a;

    cout << a;//正确

    cout << *&a;//正确

    cout << &a;

    cout << *a;

    1
    point
    3。

    已知字符串 char a[] = "hollo,world"; 由于存在拼写错误,现在我们想让这个字符串变成"hello,world",以下操作哪些是正确的?

    char *p = a;

    p++;

    *p = 'e';

    * (a + 1) = 'e';

    a[1] = 'e';

    a++;

    * a = 'e';

    &(a+1) = 'e';

    注意:

    //
    //  main.cpp
    //  gdsfa
    //
    //  Created by gailsunset on 2017/11/23.
    //  Copyright © 2017年 gailsunset. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    int main(){
        char a[]="hollo,word";
    //第一种方法 succeed
    //    char *p=a;
    //    p++;
    //    *p='e';
        
    //    第二种方法 succeed
    //    *(a+1)='e';
        
    //    第三种方法 succeed
        a[1]='e';
        
    //    第四种方法 a++没有意义,因为a是常量
        a++;
        *a='e';
        &(a+1)='e';
        
        
        for(int i=0;i<11;i++)
        {
            cout<<a[i]<<endl;
        }
            
        return 0;
        
    }
    1
    point
    4。

    有double num = 3.14; double * pi = & num; 现在pi指向的地址的内容为3.14。然而我们又想要提高精度,将它变成3.14159。在不考虑代码优美性、易读性的情况下,以下操作正确的有哪些?

    π = 3.14159

    pi[0] = 3.14159 //正确

    pi = 3.14159

    *pi = 3.14159 //正确

    1
    point
    5。

    已知定义了数组int a[10]; 并且a指向的地址为0x22ff44。假设整形占4个字节,那么下列哪个说法是正确的?

    a+1所指向的地址为0x22ff48,因此a+1数组元素a[1]的地址 正确 第二次选择

    a+1所指向的地址为0x22ff48,因此a+1不是数组元素a[1]的地址

    a+1所指向的地址为0x22ff45,因此a+1不是数组元素a[1]的地址

    a+1无合法语义//数组名a为常量(不是变量),不能给a赋值。【第一次选择 wrong】

    a+1所指向的地址为0x22ff45,因此a+1数组元素a[1]的地址

    1
    point
    6。

    已知字符串char str[] = "hello,world"; 现在我们想输出字符串的后半部分,即",world",以下操作正确的包括哪些?

    cout << str[5:10] << endl; //编译错误,expected ‘]’ ???

    cout << str + 5 << endl; //正确

    for(int i = 5; i <= 10; i++)  //正确

        cout << str[i];

    cout << endl;

    cout << *(str + 5) << endl; //相当于输出 str[5],即 ‘,’

    cout << &(str + 5) << endl; //报错 Cannot take the address of an rvalue of type 'char *'

    cout << str[5] << endl; //输出‘,’

    for(int i = 5; i <= 10; i++) //正确

        cout << *(str + i);

    cout << endl;

    1
    point
    7。

    以下函数的输出结果是:

    int fun( ){

        char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;

        int i = 8;

        p = a + i;

        cout << p - 3 << endl;

        return 0;

    }

    // 9?   console:6789 为什么是6789 因为-3吗,前面的例子+5,则把5以后的数都输出了。

    1
    point
    8。

    以下函数的运行结果是:

    int fun( ){

        int a[ ]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, };

        int *p = a + 5, *q = NULL;

        *q = *(p + 5);

        cout << *p << " " << *q << endl;

        return 0;

    }

    运行后报错 //正确 开始以为是6 11,但 运行时出错了。

    6 6

    6 12

    5 5

    1
    point
    9。

    以下函数返回a所指数组中最小的值所在的下标,其中n为数组a的大小。那么划线处应该填入:

    int fun(int *a, int n){

        int i = 0;

        int p = i;

        for (; i < n; i++)

            if (a[i] < a[p])

                ____;

        return p;

    }

    p = i 

    p = * a[i] //不确定是不是这个 第一次选 wrong

    p = a

    p = * a// 第三次选  错误

    i = p

    p = & a

    p = a[i]//第二次选 wrong

    p = & a[i]

    1
    point
    10。

    以下函数的返回值是什么?

    char* fun(char * p){

        return p;

    }

    无意义的值//不确定选这个 第一次选 错误

    p[0]这个字符  //第2次选  wrong

    p自身的地址值

    p指向的地址值 //第3次选 正确

    1
    point
    11。

    下列程序的输出结果是:

    int b = 2;

    int func(int *a){

        b += *a;

        return b;

    }

    int main( ){

        int a=2, res=2;

        res += func(&a);

        cout << res << endl;

        return 0;

    }

    //

    1
    point
    12。

    有如下程序段

        int *p, a = 10, b = 1;

        p = &a;

        a = *p + b;

    执行该程序段后, a 的值为:

    11

    1
    point
    13。

    对于基类型相同的两个指针变量之间,以下哪一项操作缺乏有价值的语义?

    //

    A选项两个同类型的指针间可以比较大小,比较原则应该是按照实际内存的高低位比较的。
    B选项赋值,这个当然是可以的了。D选项两个相同指针变量相减可以获得在之间相隔的同类型元素个数(在某个类型的数组中的应用)。
    C选项是不可以的,因为两个指针相加什么都得不到,所以规定不允许相加。

    =

    +

    <

    -

    1
    point
    14。

    下面程序把数组元素中的最大值放入a[0]中, 则在if 语句中的条件表达式应该是:

    int fun( ){

        int a[10] = {6, 7, 2, 9, 1, 10, 5, 8, 4, 3}, *p = a, i;

        for( i = 0; i < 10; i++, p++)

            if(________)

                *a=*p;

        cout << *a << endl;

    }

    *p[0]> *a[0] //编译错误

    a[i] > p[0] //错误结果为 6

    p[i] > a[0] //错误 结果为 4

    p>a //错误 结果为 3

    *p>a[0] //正确  10

    *p > *a //正确 10

    *p>*a[0]//编译错误

    a[i] > a[0]//正确 10

    1
    point
    15。

    以下程序片段都能为a的元素加1,并输出。考虑程序易读性、可移植性,不考虑代码的文本长度、代码行数和执行效率,你认为代码风格最良好的是哪个?

    int a[] = {10, 21, 32, 32, 46};

    for (int i = 0; i < 5; i++){

        a[i]++;

        cout << a[i] << endl;

    } //第二次选

    int a[] = {10, 21, 32, 32, 46};

    for (int i = 0; i < 5; cout << ++a[i] << endl,i++);

    int a[] = {10, 21, 32, 32, 46};

    for (int * p = a; p < a + 5;)

        cout << ++ (p++) << endl;

    int a[] = {10, 21, 32, 32, 46};

    for (int * p = a; p < a + 5;){

        (*p)++;

        cout << *p++ << endl;

    }//考虑到学习指针 ,排除ab。 c太多++了。故选d 第一次选 错误

     
     
     
  • 相关阅读:
    list extend 和 append
    构建同元素的列表
    Python拷贝(深拷贝deepcopy与浅拷贝copy)
    MySQL之对数据库库表的字符集的更改
    Shell之while循环
    安装keepalived
    Zabbix监控MySQL
    Ganglia监控MySQL
    将Nagios监控信息存入Mysql
    Hadoop之回收站
  • 原文地址:https://www.cnblogs.com/Gailsunset/p/7887240.html
Copyright © 2020-2023  润新知