整数a和*(& a)之间有什么区别?

时间:2015-11-05 05:42:54

标签: c pointers

我没有得到整数a*(&a)之间的区别?我的意思是*(&a)返回a地址中包含的值,它与a相同,不是吗?那么为什么在这种情况下使用指针呢?

4 个答案:

答案 0 :(得分:4)

  

整数a*(&a)之间有什么区别?

没有区别。 int a;a声明为int类型的变量。 &a a的地址属于int *类型,即指针类型,因此可以取消引用。因此,*(&a)会给出a的值。

答案 1 :(得分:2)

只要a是变量,就没有区别,它们是相同的。

但是,如果您在宏中使用该表达式,则它将因为临时对象(*&(x+1))或文字(*&5)的编译器错误而失败。也许在代码中进行区分是有原因的。

答案 2 :(得分:0)

以此为例,

int a = 1;
int *ptr = &a;

ptr指向内存中的某个地址,而ptr本身的地址在内存中是不同的。

现在,看看下图,

// *ptr = *(&a) 
// Get the adress of `a` and dereference that address.
// So, it gives the value stored at `a`

memory address of        a -> 0x7FFF1234
value stored at          0x7FFF1234 = 1

memory address of        ptr -> 0x7FFF4321
value stored at          0x7FFF4321 = &a = 0x7FFF1234

                                           +-------+
           +------------>  0x7FFF1234 ---->|a = 1  |
           |                               +-------+
           |              +-----------------+ 
           |              | ptr =           |    
           +--*ptr<-------| 0x7FFF1234 [&a] |<--- 0x7FFF4321       
                          +-----------------+

因此,两者之间存在无差异,即int a*(&a)相同。

答案 3 :(得分:0)

更重要的是,您通常不会写*(&a)*&a。这可能是由宏或其他东西引起的,但你通常永远不会明确地写出类似的东西。你可以把它带到极端:*&*&*&*&*&*&a同样适用。你可以自己试试:

#include <stdio.h>

int main()
{
    int     a = 123;
    int     b = *&*&*&*&*&*&a;

    printf("%d\n", b);

    return 0;
}