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

标签 c++ c arrays pointers memory

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

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

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

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

我最终想到,我想确认一下:即使用方括号 ([]) 声明的数组实际上在内存中也是一个 n 指针序列,每个指针都包含(作为值而不是地址)包含实际值的存储盒 Bi 的地址 + 那些存储盒(B0,...,Bn 每个都包含实际值)。这样,当一个人声明“int array[5]”时,程序实际上分配了 5 个相邻的 int 指针框 P0、P1、..、P4 和 5 个 int 大小的内存位置,分散在计算机内存 B0、B1 中。 ..,B4 其中Pi的值为Bi的地址

enter image description here

我是对还是错!!???谢谢!

最佳答案

arrays when even declared with the square brackets ([]) are actually in memory a sequence of n pointers each containing [...] the address of a memory box Bi containing the actual value + those memory boxes

没有。

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

secret 在于:数组索引运算符 ([]) 不适用于 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

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

关于c++ - 数组如何在 C/C++ 中内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19370231/

相关文章:

c++ - 将具有公共(public)头文件的目标文件链接到 main 会给出体系结构 x86_64 错误的重复符号

java - 打印数组 : memory address or its content?

c - C 中的 2 元素数组列表

python - 按另一个数组的列对一个数组进行排序 - Python

c++ - 转换光线与投影顶点?

c++ - 可变大小数组的范围

c++ - LIBUSB编译错误

iphone - 如何使用C语言向数据库中插入数据?

c++ - QLabel在调整大小时切断文本

c - 从文本文件读取以填充结构类型