2.3.2练习

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

#include <iostream>
int main()
{
    int i = 5, j = 10;
    int *p = &i;
    p = &j;
    *p = 15;
    j = 20;
}    

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

  • 指针本身就是一个对象,允许对其赋值和拷贝,而指针的生命周期内它可以指向几个不同的对象;引用不是一个对象,无法令引用重新绑定到另外一个对象。
  • 指针无须在定义时赋值,和其他内置类型一样,在块作用域定义的指针如果没有被初始化,也将拥有一个不确定的值:引用必须在定义时赋处置。

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

    int i = 0;
    (a)double* dp = &i;
    (b)int *ip = i;
    (c)int *p = &i;

a是非法的,dp是一个double指针,而i是一个int变量,类型不匹配。

b是非法的,不能直接把int变量赋给int指针,正确的做法是通过地址运算&i得到变量i在内存中的地址,然后再将该地址赋给指针。

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

      int i=42;
      int *p1=&i;
      *p1=*p1 * *p1;

定义一个整型变量i并设置初始值为42,接着定义一个整型指针p1,令其指向变量i,最后取出p1所指的当前值,计算平方后重新赋值给p1所指的变量i。

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

if(p) //...
if(*p)//...

如果指针指向一个真实存在的变量,则其值必不为0,此时为真。如果指针没有指向任何对象或者是无效指针,则对p的使用将引用将引发不可预计的结果。

如果该int值为0,则条件为假,否则条件为真。

给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也说明原因

只需要把p作为if的语句的条件即可,如果p的值是nullptr,则条件为假,反之为真。

一般处理的办法是将if(p)置于try结构中,当程序块顺利执行时,表示p指向了合法的对象,当程序块出错跳转到catch语句时,表示p没有指向合法的对象。

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

int i=42;
void *p=&i;
long *lp=&i;

void* 是一种特殊的指针类型,可用于存放任意对象的地址。

lp是一个长整型指针,而i只是一个普通整型数,两者的类型不匹配。

猜你喜欢

转载自www.cnblogs.com/suomeimei/p/10434522.html