存储位置和数据类型的表示形式

Storage Location and Representation of Data Type

本文关键字:表示 数据类型 位置 存储      更新时间:2023-10-16

我试图找出声明变量时基本数据类型的存储位置以及基本数据类型的二进制表示形式。 下面是一些从数组外部获取数据的代码。 与最后一行相关的输出因我声明数组 YoMammy[] 的方式而异;已签名或未签名。 我知道这是正常的,但我不知道基本数据类型存储在哪里。 此信息是否与指针一起存储? 我知道数组只是引用指针的另一种方式。

int main()
{
    unsigned int YoMammy[2]={3,7};
    cout<<YoMammy[0];
    cout<<endl;
    cout<<YoMammy[1];
    cout<<endl;
    cout<<YoMammy[2];
    return 0;
}

访问数组范围之外的元素会导致未定义的行为。您可能会获得一些价值作为YoMammy[2],您可能会遇到分段错误,或者发生一些奇怪的事情。

我知道数组只是引用指针的另一种方式。

啊,不,不

,不。在许多情况下,数组名称将转换为指向其第一个元素的指针。但数组不是指针。

此外,您可以将呼叫链接到 std::cout ,它使您的生活更轻松:

std::cout << YoMammy[0] << std::endl << YoMammy[1] << std::endl << YoMammy[2];

没有存储描述C++中简单数据类型的元数据。 您观察到有符号整数和无符号整数之间的某种关系只是巧合。

这就是未定义的行为。 它可能表现出一种模式,但尚未定义。 不要试图定义没有定义的行为。=)

逻辑意义上的数组是物理中的存储。这意味着它是一个位置,有几个街区。 int would = i=[9]是名称的一个插槽。而阵列在同一位置有多个插槽array=[][][][][][][][]

问:变量存储在哪里?

您可以打印地址并亲自查看变量的位置。

std::cout<<"Location of YoMammy[0]: "<<&YoMammy[0]<<std::endl;
std::cout<<"Location of YoMammy[1]: "<<&YoMammy[1]<<std::endl;

由于您声明的那些是main()函数的本地。它们存储在堆栈段中。

问:与最后一行相关的输出是不同的,这取决于我如何声明数组 YoMammy[];有符号或无符号

数组索引从 0 n-1 开始。 n是数组的大小。

YoMammy[2] ) 越界访问是未定义的行为。它可能导致分段错误堆栈粉碎或只是打印一些垃圾值(每次运行程序时您都不能期望相同)等,

问:我知道数组只是引用指针的另一种方式。

不。数组不是指针。尽管数组名称衰减为指向数组第一个元素的指针。它也有例外。阅读此内容