指针与引用

来源:互联网 发布:监听软件 编辑:程序博客网 时间:2024/06/08 04:23

今天看了《程序员面试宝典》,看到指针与引用一章,看到一些比较好的题目,记录下来,以便之后回想。

struct S{

    int i;

    int *p;

}

main()

{

    S s;

    int *p = &s.i;

    p[0] = 4;

    p[1] = 3;

    s.p = p;

    s.p[1] = 1;

    s.p[0] = 2;

}

问你程序会在哪一行崩溃掉?

分析程序:(1)首先定义一个S的对象s

               (2)定义一个int型指针指向对象s的成员i。

               (3将4赋予指针指向的i

               (4)将i后面的值即p赋予一个地址,即3

              (5)对象s的成员p得到main内p的值,即对象s的成员i的地址,现在对象s的成员p指针存放了成员i的地址

              (6)*s.p = s.p[0] =s.i,那么*(s.p+1) =  s.p[1] = s.p; 的确有点绕,但是用语言概括,因为是s.p存放了s.i的地址,那么s.p[0]就是s.i的值。那么s.p[1]就是s.p存放的值,即它存放的s.i地址。所以s.p[1]和s.p是一样的,

             (7)现在你把s.p[1]即s.p存放的地址改成1,那么s.p不再存放s.i的地址,那么s.p[0]本来指的是s.i,现在是一段未知的控空间,给未知的空间赋值,很明显会段错误

总的来说,这道题构思非常巧妙,关键两个等于:s.p[0] = s.i; s.p[1] = s.p = &s.i。