sách gpt4 ai đã đi

C/C++ 多维数组内部

In lại Tác giả: Space Dog 更新时间:2023-10-29 16:25:30 25 4
mua khóa gpt4 Nike

我有一个关于 C/C++ 如何在内部存储使用符号 foo[m][n] 声明的多维数组的问题。我不是在质疑指针等的纯指针......我是因为速度原因而问......

如果我错了请纠正我,但语法上 đồ ăn 是一个指针数组,它们本身指向一个数组

int foo[5][4]
*(foo + i) // returns a memory address
*( *(foo + i) + j) // returns an int

我从很多地方听说C/C++编译器在后台将foo[m][n]转换为一维数组(用i计算需要的一维索引* 宽度 + j)。但是,如果这是真的,那么以下内容将成立

*(foo + 1) // should return element foo[0][1]

因此我的问题是:foo[m][n] 是否(总是?)作为平面一维数组存储在内存中?如果是这样,为什么上面的代码会像所示的那样工作。

1 Câu trả lời

一个二维数组:

int foo[5][4];

只不过是一个数组的数组:

typedef int row[4]; /* type "row" is an array of 4 ints */
row foo[5]; /* the object "foo" is an array of 5 rows */

这里没有指针对象,无论是显式的还是隐式的。

数组不是指针。指针不是数组。

经常引起混淆的是,在大多数上下文中,数组表达式 被隐式转换为指向其第一个元素的指针。 (还有一条单独的规则说,看起来像数组参数声明的实际上是指针声明,但这不适用于此示例。)数组 sự vật 是数组对象;声明这样的对象不会创建任何指针对象。引用一个数组对象可以创建一个指针giá trị(数组第一个元素的地址),但是内存中没有存储指针对象。

数组对象 đồ ăn 在内存中存储为 5 个连续的元素,其中每个元素本身就是一个由 4 个连续的 số nguyên 元素组成的数组;因此,整个事情存储为 20 个连续的 số nguyên sự vật.

索引运算符是根据指针算法定义的; x[y] 等同于 *(x + y)。通常,左操作数将是指针表达式 hoặc 数组表达式;如果它是一个数组表达式,则该数组被隐式转换为一个指针。

因此 foo[x][y] Tương đương với *(foo[x] + y),后者又等价于 *(* (foo + x) + y)。 (请注意,不需要强制转换。)幸运的是,您不必那样写,而且 foo[x][y] 更容易理解。

请注意,您Có thể创建一个可以使用相同的 foo[x][y] 语法访问的数据结构,但是 đồ ăn 实际上是一个指向 int 的指针。 (在那种情况下,每个 [] 运算符的前缀已经是一个指针表达式,不需要转换。)但是要做到这一点,你必须声明 đồ ăn 作为一个指向整数的指针:

int **foo;

然后分配并初始化所有需要的内存。这比 int foo[5][4] 更灵活,因为您可以动态确定行数和每行的大小(甚至存在)。

comp.lang.c FAQ 的第 6 节很好地解释了这一点。

biên tập:

在回应 Arrakis 的评论时,请务必牢记类型thể hiện 之间的区别。

比如这两种:

struct pair { int x; int y;};
typedef int arr2[2];

很可能在内存中具有相同的表示(两个连续的 số nguyên 对象),但访问元素的语法却完全不同。

类似地,int[5][4]int[20] 类型具有相同的内存布局(20 个连续的 số nguyên 对象),但访问元素的语法不同。

BạnCó thể访问foo[2][2]BẰNG((int*)foo)[10](处理2-维数组,就好像它是一维数组一样)。有时这样做很有用,但严格来说行为是未定义的。您可能会逃避它,因为大多数 C 实现不进行数组边界检查。另一方面,优化编译器可以假定您的代码行为已定义,如果未定义则生成任意代码。

关于C/C++ 多维数组内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7784758/

25 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com