第四周指针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 第一次选 错误

 
 
 
原文地址:https://www.cnblogs.com/Gailsunset/p/7887240.html