使用指针的数据类型的大小

Size of data types using pointers?

本文关键字:数据类型 指针      更新时间:2023-10-16

我想看看我电脑上数据类型的大小。因此,我开始使用int数据类型,代码如下:

#include <iostream>
using namespace std;
int main()
{
int t, *tpntr1, *tpntr2;
tpntr1 = &t;
cout << "The first address: t" << tpntr1;
tpntr2 = ++tpntr1;
cout << "n The second address : t" << tpntr2;
unsigned int size= (tpntr2 - tpntr1);
cout << "n the size of int : t" << size<<"n";
return 0;
}

在visual studio中编译后,大小返回为0。在一个特定的运行中,第一个地址是0028FBA4,第二个地址是0028FBA8,但差值为零。谁能指出我哪里做错了吗?我猜这和十六进制到十进制的转换有关

提示:将cout移到最后看看发生了什么:

#include <iostream>
using namespace std;
int main()
    {
    int t, *tpntr1, *tpntr2;
    tpntr1 = &t;
    tpntr2 = ++tpntr1;
    unsigned int size= (tpntr2 - tpntr1);
    cout << "The first address: t" << tpntr1;
    cout << "n The second address : t" << tpntr2;
    cout << "n the size of int : t" << size<<"n";
    return 0;
}

地址相同。你实际上是把tpntr2分配给tpntr1

如果您将tpntr2 = ++tpntr1更改为

tpntr2 = tpntr1;
tpntr2++;

它将部分地做你想做的。注意,这将打印1作为大小。我可能是错的,但指针算术考虑到类型的大小(有人请纠正我,如果这不是情况。我不能解释它)。

正如Carcigenicate指出的那样,您的主要问题是++修改了值。然而,由于指针运算的工作方式,您也可能无法得到您想要的结果。

正确的格式是:

tpntr1 = &t;
tpntr2 = tpntr1;
tpntr2++;

但是,结果将是1,因为tpntr2 - tpntr1将返回int数的差值。因为int值是4字节(至少在我的实现中是4字节),所以即使内存地址间隔为4,也会打印出差异为1。

如果你想要实际的字节数(应该是4),你需要转换为一个可以绕过这种行为的类型。您有两种选择:将指针强制转换为int型,这将使其成为对数字的简单数学操作,或者reinterpret_cast<char*>,这将告诉它将指针视为指向一个字节的内存。例如,这将显示大小为4:

int main()
    {
    int t, *tpntr1, *tpntr2;
    tpntr1 = &t;
    tpntr2 = tpntr1;
    tpntr2++;
    unsigned int size= (reinterpret_cast<char*>(tpntr2) - reinterpret_cast<char*>(tpntr1));
    cout << "The first address: t" << tpntr1;
    cout << "n The second address : t" << tpntr2;
    cout << "n the size of int : t" << size<<"n";
    return 0;
}