我想知道数组如何在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>
我是对还是错!!谢谢!
答案 0 :(得分:12)
甚至用方括号([])声明的数组在内存中实际上是一个n个指针的序列,每个指针包含一个包含实际值的存储器盒Bi的地址+那些存储器盒
不。
对于声明为array[0] == *(array+0) == *array
和int 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)
的语法糖。
不,没有指针,数组实际上包含连续内存范围内的值。