C++ 指针的大小(*变量VS变量)

C++ 指针的大小(*变量VS变量),c++,pointers,sizeof,C++,Pointers,Sizeof,根据我对32位机器的理解,指针的大小是32位(4字节),而在64位机器上是8字节。不管它们指向什么数据类型,它们都有固定的大小。我的电脑是64位运行的,但当我打印出包含*的大小时,我得到了4。为什么会这样?打印变量和打印*变量有什么区别 int *name = NULL; int *add = NULL; cout<< sizeof (*name) << endl; // Prints 4 cout << sizeof (add

根据我对32位机器的理解,指针的大小是32位(4字节),而在64位机器上是8字节。不管它们指向什么数据类型,它们都有固定的大小。我的电脑是64位运行的,但当我打印出包含*的大小时,我得到了4。为什么会这样?打印变量和打印*变量有什么区别

   int *name = NULL;
    int *add = NULL;

    cout<< sizeof (*name) << endl; // Prints 4
    cout << sizeof (add); //Prints 8
int*name=NULL;
int*add=NULL;

cout操作符
*
取消引用指针。换句话说,它给你它指向的东西

name
具有类型
int*
,因此
*name
具有类型
int
。这意味着
sizeof(*name)
sizeof(int)
相同,在您的系统上是4

同样地,
add
具有类型
int*
。这意味着
sizeof(add)
sizeof(int*)
相同,在您的系统上是8。

因为
sizeof(*name)
sizeof(name)
不同。前者是
int
,而不是
int*
。在大多数架构中,
int
可能是4个字节。

这两条指令

sizeof(*name)
sizeof(add)
完全不同

sizeof(add)
的情况下,您需要指针的大小,即正确分析时的64位(8字节)

sizeof(*name)
的情况下,指令首先解除对指针的引用,然后将sizeof函数应用于解除引用的指针(在int上)。因此,结果将是32位(4字节)。这也是因为在64位体系结构中,int可以是32位

这是因为sizeof是一个编译时构造。如果我们看一下C99标准草案第6.5.3.4节,第2段中操作员的大小(重点):

[…]大小由操作数的类型决定。结果 是一个整数。如果操作数的类型是可变长度数组 类型,则计算操作数;否则,该操作数不可用 计算,结果是一个整数常量


因为一个是指针,而另一个不是?你开始谈论指针的大小,然后切换到指向对象的大小来回答你的问题,这看起来很奇怪。在未赋值的操作数(例如
sizeof
的参数)中取消对null的引用是可以的,你有这样的源代码吗?是的,参见标准