C++ 指针的大小(*变量VS变量)
根据我对32位机器的理解,指针的大小是32位(4字节),而在64位机器上是8字节。不管它们指向什么数据类型,它们都有固定的大小。我的电脑是64位运行的,但当我打印出包含*的大小时,我得到了4。为什么会这样?打印变量和打印*变量有什么区别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
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的引用是可以的,你有这样的源代码吗?是的,参见标准