跳转至

2.3 复合类型

练习 2.15

下面的哪个定义是不合法的?为什么?

(a) int ival = 1.01;
(b) int &rval1 = 1.01;
(c) int &rval2 = ival;
(d) int &rval3;
#include <iostream>

// a:合法,丢失精度
// b:不合法,引用必须初始化
// c:合法
// d:不合法,引用必须初始化

int main()
{
    int ival = 1.01;
    //int &rval1 = 1.01;
    int &rval2 = ival;
    //int &rval3;

    return 0;
}

练习 2.16

考查下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?

int i = 0, &r1 = i;    doubled = 0, &r2 = d;
(a) r2 = 3.14159;
(b) r2 = r1;
(c) i = r2;
(d) r1 = d;
#include <iostream>

// a:合法,引用是一个别名
// b:合法,相当于一个变量赋值给一个别名
// c:合法,别名给变量赋值相当于变量赋值给变量
// d:合法,相当于将r1别名改成d的别名

int main()
{
    int i = 0, &r1 = i;
    double d = 0, &r2 = d;

    r2 = 3.14159;
    r2 = r1;
    i = r2;
    r1 = d;

    return 0;
}

练习 2.17

执行下面的代码段将输出什么结果?

int i, &ri = i;
i = 5; ri = 10;
std::cout << i << " " << ri << std::endl;
#include <iostream>

// 都输出10

int main()
{
    int i, &ri = i;
    i = 5;
    ri = 10;

    std::cout << i << " " << ri << std::endl;

    return 0;
}

练习 2.18

编写代码分别更改指针的值及指针所指向对象的值。

#include <iostream>

int main()
{
    int *a = nullptr;
    int b = 10;
    a = &b;
    std::cout << *a << std::endl;
    *a = 11;
    std::cout << b << std::endl;

    return 0;
}

练习 2.19

说明指针和引用的主要区别。

1.指针存放地址的变量占用内存空间
     指针可以不初始化

2.引用变量的别名不占用内存空间
     引用必须在定义时初始化

练习 2.20

请叙述下面这段代码的作用

int i = 42;
int *p1 = &i;
*p1 = *p1 * *p1;
#include <iostream>

// 改变值i为i的平方

int main()
{
    int i = 42;
    int *p1 = &i;
    *p1 = *p1 * *p1;
    std::cout << i << '\n';

    return 0;
}

练习 2.21

请解释下述定义。在这些定义中有非法吗?如果有,为什么?

int i = 0;
(a) double* dp = &i;
(b) int *ip =i;
(c) int *p = &i;
#include <iostream>

int main()
{
    int i = 0;
    double *dp = &i;    // 不能直接将int类型指针赋值给double类型指针
    int *p = &i;
    int *ip = i;        // 不能直接将整形0转成指针

    return 0;
}

练习 2.22

假设p是一个int型指针,请说明下述代码的含义

if (p)    // p指向的地址不为NULL时执行代码块
if (*p)   // p指向的地址内容大于0执行代码块

练习 2.24

在下面这段代码中为什么p合法而lp非法?

int i = 42;
void *p = &i;
long *lp = &i;
因为泛型指针void *并没有步长任意类型都可以强转为泛型指针而long *在不同操作系统的步长不一样如果强转可能会访问到非法内存

练习 2.25

说明下课变量的类型和值。

(a) int* ip,i, &r = i;
(b) int i, *ip = 0;
(c) int* ip, ip2;
#include <iostream>

int main()
{
    //int* ip,i,&r = i;  // ip--int* i--int* r--(int*)& 
    //std::cout << "ip:" << ip << " i:" << i << " r:"<< r << std::endl;

    //int i, *ip = 0;    // i--int ip--int*
    //std::cout << "i:" << i << " ip:" << ip << std::endl;

    int* ip, ip2;      // ip--int* ip2--int*
    std::cout << "ip" << ip << " ip2:" << ip2 << std::endl;

    return 0;
}