首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“数组”元素值是存储在一个位置还是存储在不同的位置?

“数组”元素值是存储在一个位置还是存储在不同的位置?
EN

Stack Overflow用户
提问于 2016-11-01 16:31:29
回答 5查看 4.9K关注 0票数 0

因为C语言中没有数组这样的东西,所以下面的所有内容都存储在一个内存位置中,还是每个元素的值都存储在内存位置的“数组”中?

代码语言:javascript
复制
int array[] = {11, 13, 17, 19};
  • 场景1 {11、13、17、19} ->地点A
  • 场景2 { 11 ->位置A 13 ->位置B 17 ->位置C 19 ->位置D}

哪个是有效的内存布局?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-01 16:37:21

C显式地将“数组”定义为.类型。

引用C11,第6.2.5节,类型(强调地雷)

数组类型描述具有特定成员对象类型(称为元素类型的)的连续分配的非空对象集。只要指定了数组类型,元素类型就应该完成。数组类型的特征是它们的元素类型和数组中的元素数。数组类型被认为是从它的元素类型派生出来的,如果它的元素类型是T,则数组类型有时被称为‘数组T’。从元素类型构造数组类型称为“数组类型派生”。

简而言之,答案是,数组元素存储在单独但相邻的位置。

假设我们已经声明了一个5 int的数组

代码语言:javascript
复制
int arr[5];

然后,在整数大小为2字节(szeof(int) ==2)的平台上,数组的元素组织如下:

在另一个平台上,在sizeof(int) == 4上,它可以是:

所以表示

代码语言:javascript
复制
{
    11 --> location A
    13 --> location B
    17 --> location C
    19 --> location D
}

是有效的,考虑到B == A + 1C == B + 1等。

在这里,请注意,指针算法考虑数据类型,因此A+1将不会产生一个具有1 byte增量的地址,而是由一个element增加。换句话说,两个连续元素的地址之间的差异将与数据类型(sizeof (datatype))的大小相同。

票数 7
EN

Stack Overflow用户

发布于 2016-11-01 16:37:46

元素将位于相邻的内存位置。

array[0]位于位置B,数组的每个元素的大小,即sizeof(int),是S。

代码语言:javascript
复制
array[0] at B
array[1] at B + S
array[2] at B + 2S
..
array[n] at B + n*S
票数 3
EN

Stack Overflow用户

发布于 2016-11-01 16:38:03

编译器在特定的连续位置分配数组。

您还可以使用下一段代码检查它:

代码语言:javascript
复制
#include <stdio.h>

void main()
{
    int array[] = {11, 13, 17, 19};
    for (int i = 0; i < 4; i++)
        printf("0x%p ", &array[i]);
}

给出十六进制地址。

代码语言:javascript
复制
0x14fee0 0x14fee4 0x14fee8 0x14feec

每个元素的边距为4个字节时,int的大小。

通常,您可以将指向数组中一个元素的指针,例如索引m,并将其添加为n作为多个元素,并在数组中获取指向n+m索引的指针。

代码语言:javascript
复制
*(array + n) == array[n]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40364357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档