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

Pai*_*Han 22 c c++ memory arrays pointers

我想知道数组如何在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的地址

在此输入图像描述

我是对还是错!! 谢谢!

bam*_*s53 13

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

不.

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

这是秘密:数组索引operator([])不适用于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
Run Code Online (Sandbox Code Playgroud)

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

  • @EJP Nope,如果您阅读C++规范,您将看到下标运算符仅定义为使用"指向T的指针"类型的表达式,而不是具有数组类型的表达式.在数组上使用下标的原因与在指针上使用它是相同的是因为在数组上使用它首先将数组转换为指针,然后它实际上是相同的. (7认同)