请问&*p等于*&p?这两个怎么理解

1个回答

  • &和*在c/c++里用法较多,用在不同的地方,意思不同.

    * 用于语句里的指针变量时,表示指针指向的值.例如:printf("%d",*p);

    &用于语句里的普通变量时,表示求普通变量的地址.例如:int a; p=&a;

    “&*p等于*&p“ -- 是用于指针变量.例如:

    声明:int a=1; int *p=&a;

    语句:printf("%x %x ",&*p,*&p);

    这里 &*p 和 *&p 都等于 p,也就是 p 指向的 变量的地址,这里 正好 都等于 变量 a 的 地址.

    ------------------

    来段程序:

    #include

    #include

    main()

    {

    int a=2,b=3;

    int *p; // 声明了,但没有初始化

    printf("%xn",*p); // 没有初始化就使用,有警告性错误,没关系,继续跑.

    printf("a:%pn",&a); // 打印 a 地址

    printf("b:%pn",&b); // 打印 b 地址

    printf("p:%pn",&*p);

    printf("p:%pn",*&p);

    p = &a; // p 指向 a

    printf("%xn",*p); // p 指向的值

    printf("a:%pn",&a);

    printf("b:%pn",&b);

    printf("p:%pn",&*p); // 注意地址 等于 a 的地址

    printf("p:%pn",*&p); // 注意地址 等于 a 的地址

    p=&b; // p 指向 b

    printf("%xn",*p);

    printf("a:%pn",&a);

    printf("b:%pn",&b);

    printf("p:%pn",&*p); // 注意地址 等于 b 的地址

    printf("p:%pn",*&p); // 注意地址 等于 b 的地址

    }

    ===

    可见 “&*p等于*&p“ 等于 p.我们可以把 &*,*& 理解成 是合在一起的 1 个符号.

    都 表示 指针指向的当前 地址.

    你硬要分开理解就是:

    *p 是指针指向的值,&*p 是指针指向的值的地址,也就是 指针指向的当前 地址.马马虎虎可以理解.

    &p 是指针自己的地址,*& 难以理解了.