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

时间:2013-10-14 22:20:40

标签: c++ c arrays pointers memory

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

我们知道数组是一系列相邻的内存情况(框),其中每个框的大小与它所存储的类型相同(即,如果INT的一个框具有size = sizeof(int),则一个3 INT的数组接收内存相邻的3 sizeof(int))

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

让我感到奇怪的是,当使用括号[0]调用数组时,数组的原点是数组的第一个框的地址和第一个值(后面框中的值) 0] == *(数组+ 0)== *数组(数组是否已声明"类型*数组"或"类型数组[]"或"类型数组[大小]")和"数组"这样称为定义为指针还是数组("类型*数组"或"类型数组[]"或"类型数组[大小]")是第一个框的地址。

我最终在思考并且我想对此进行确认:当使用方括号([])声明时,数组实际上在内存中是一系列n个指针,每个指针都包含(具有不作为值的值)地址)包含实际值的存储器盒的地址+那些存储器盒(B0,...,Bn,每个存储器包含实际值)。这样,当一个人声明&#34; int array [5]&#34;程序实际上分配了5个相邻的int指针框P0,P1,..,P4和5个整数分布在整个计算机存储器B0,B1,...,B4的内存位置,其中Pi的值是Bi的地址< / p>

enter image description here

我是对还是错!!谢谢!

3 个答案:

答案 0 :(得分:12)

  甚至用方括号([])声明的

数组在内存中实际上是一个n个指针的序列,每个指针包含一个包含实际值的存储器盒Bi的地址+那些存储器盒

不。

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

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

{{1}}

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

将其视为:

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

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