数组如何在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)
的语法糖。
不,没有指针,数组实际上包含连续内存范围中的值。