首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定义2d数组: int *arr[ ]和int arr[ ]在内存中的表示方式上有什么区别?

定义2d数组: int *arr[ ]和int arr[ ]在内存中的表示方式上有什么区别?
EN

Stack Overflow用户
提问于 2022-05-31 08:51:12
回答 3查看 168关注 0票数 1

我一直在试图理解这两个定义之间的区别,以及如何正确地使用它们。

在我看来,用arr[length][width]定义2d数组将矩阵的内容依次存储在一个接一个的内存中(矩阵基本上是一个大行),这样您就可以以这样的方式访问i,j坐标中的数字:*(arr+width*i+j)。当将它发送到一个函数时,声明可以是func(int *arr),访问矩阵内容没有问题,因为2d数组是如何在内存中表示的。

然而,将数组定义为int *arr[];似乎并没有以相同的线性、连续的方式将矩阵的内容存储在内存中。函数的声明必须是func(int **arr)(int *arr[])。虽然你仍然可以像这样通过坐标i,j来访问矩阵:arr[i][j],但这样做似乎是不可能的:*(arr+width*i+j)。我是否认为它是正确的,因为用这种方式定义2d矩阵不会连续地将矩阵的行存储在内存中,还是我遗漏了什么?

EN

回答 3

Stack Overflow用户

发布于 2022-05-31 09:08:46

这声明了一个2D数组:

代码语言:javascript
运行
复制
int arr1[100][200];

这声明了一个一维指针数组:

代码语言:javascript
运行
复制
int *arr2[100];

它们不是一回事。arr1包含20000个ints,arr2包含100个指针。

arr120将计算第21行、第31列的地址,并直接到那里去。arr220将计算第21指针的地址,读取指针,在指针指向的位置之外计算出地址30 int (因此,31 int,如果它指向一个int数组),然后转到那里。

如果愿意,您可以为20000个ints分配空间,并且可以保存指向arr2中每一行的指针。然后,两者都可用于将数字存储在行和列中。

arr2的优点在于,因为每一行都有一个指向实际数据的指针,所以可以有不同大小的行、重叠行或缺失行。在arr1中,行正好有200个In长,没有例外。arr2的缺点是计算机必须做更多不需要做的工作,也就是速度更慢。arr2的另一个缺点是,您仍然需要有一个位置来放置ints,所以如果您的问题是要找到放置ints的位置,那么arr2实际上并不能解决这个问题。

票数 5
EN

Stack Overflow用户

发布于 2022-05-31 09:14:22

声明意味着不同的事情。即使您可以通过相同的语法访问(读/写)一个整数,因为x[y]等同于*(x + y)

int *a[]是一个一维指针数组。

每个指针可以(但不一定)指向一个一维整数数组。它也可以是空指针,也可以是指向单个整数的指针。

如果所有指针指向整数的一维数组,则这些数组可以是不同大小的。

每个一维数组( a作为指针数组和指针指向的每个整数数组)都在内存中连续地拥有其所有元素。但这些一维阵列的位置是任意的。

int a[][]是一个二维整数数组。

所有整数在内存中都是连续的。

票数 1
EN

Stack Overflow用户

发布于 2022-05-31 09:14:26

如果你有这样的数组

代码语言:javascript
运行
复制
int arr[length][width];

然后,这个表达式*(arr+width*i+j)访问数组的元素是不正确的,至少因为表达式的类型是int[width]而不是int,而且一般来说,当至少i不等于0时,将访问数组之外的内存。

要访问数组的元素,必须使用以下表达式*( *( arr + i ) + j )

处理数组的函数可以通过以下方式声明

代码语言:javascript
运行
复制
void f( size_t, size_t, arr[*][*] );

或使声明更具可读性,如

代码语言:javascript
运行
复制
void f( size_t rows, size_t cols, arr[][cols] );

至于这个数组

代码语言:javascript
运行
复制
int * arr[length];

这是一个一维数组,每个元素依次指向一个单独的一维数组,然后可以使用相同的表达式*( *( arr + i ) + j )访问数组arr[i][j]的元素。这是因为下标运算符是由这个公式*( *( arr + i ) + j )计算的。

相应的函数可以声明如下

代码语言:javascript
运行
复制
void f( int * arr[], size_t rows, size_t cols );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72444791

复制
相关文章

相似问题

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