数组如何在c / c ++中内部工作

我想知道数组如何在c中工作。 我最终得出一个假设,我想知道我是否正确。

我们知道数组是一系列相邻的内存盒(盒子),其中每个盒子的大小都是它所存储的类型(即如果INT的一个盒子的大小= sizeof(int),则一个3个INT的数组占用内存相邻的位置3 sizeof(int))

现在我们也知道我们可以为某种类型的数组动态分配内存(C中的malloc,C ++中的new)。

让我想知道的是,当使用括号[0]调用数组时,一个数组的原点是数组的第一个框的地址和第一个值(后面的框中的值)是数组[0] = = *(数组+ 0)== *数组(数组是否被声明为“type * array”或“type array []”或“type array [size]”)和“数组”这样称为无论是定义为指针还是数组(“type * array”或“type array []”或“type array [size]”)是第一个框的地址。

我最后想了想,我想对此进行确认:数组甚至用方括号([]声明)实际上在内存中是一系列n个指针,每个指针包含(作为一个值而不是地址)的地址一个存储盒Bi,包含实际值+那些存储盒(B0,…,Bn,每个包含实际值)。 这样,当一个人声明“int array [5]”时,该程序实际上分配了5个相邻的int指针盒P0,P1,…,P4和5个整个计算机存储器B0,B1,…的整个大小的存储器位置。 ..,B4,其中Pi的值是Bi的地址

在此处输入图像描述

我是对还是错!! 谢谢!

甚至用方括号([])声明的数组实际上在内存中是一系列n个指针,每个指针包含一个包含实际值的内存盒Bi的地址+那些内存盒

不。

听起来你很困惑array[0] == *(array+0) == *array对于声明为int array[10];的数组都是真的int array[10];int *array = ...; 。 一个完全合理的问题; 我们被告知,对于指针ptr ,表达式*ptr获取指针所指向的值,所以当我们对数组使用相同的语法时,我们解除引用的地址在哪里?

这是秘密:数组索引运算符( [] )不适用于C和C ++中的数组。 将它应用于数组时,语言会隐式地将数组转换为指向数组第一个元素的指针。 因此,添加到数组或取消引用数组似乎与添加或取消引用指针的行为相同。

 int array[10]; // These lines do exactly the same thing: int *ptr1 = &array[0]; // explicitly get address of first element int *ptr2 = array; // implicitly get address of first element 

所以数组实际上是内存中连续的元素集,其中每个元素确实是值,而不是指向包含该值的另一​​个位置的指针。 只是数组的定义方式意味着它们经常隐式转换为指针,所以看起来有指针的时候只是隐式转换。

数组连续存储在虚拟内存中。 但是,它们映射到的物理内存地址可能是连续的,也可能不是连续的。

并且数组元素不存储指向下一个元素的指针。 仅存储该值。

把它想象成这样:

array[n]只是*(array + n)的语法糖。

不,没有指针,数组实际上包含连续内存范围中的值。