当前位置: 首页 > 知识库问答 >
问题:

C语言中的多维数组:它们是锯齿状的吗?

公良理
2023-03-14

关于C编程语言(ANSI-C)的一个简单问题:

C中的多维数组是锯齿状的吗?

我的意思是——我们是在谈论“数组数组”(指向内存中其他地址的指针数组),还是这只是“长一维数组”(按顺序存储在内存中)?

困扰我的是,我有点确定:

矩阵[i][j]等价于*(*(矩阵I)j)

共有3个答案

谢典
2023-03-14

这将取决于。

C中的多维数组是顺序排列的。

如果需要使用指针,可以创建锯齿状数组。

宋岳
2023-03-14

连续存储区:

int arr[N][M];

非连续存储区:

int** arr = malloc(N*sizeof(int*));
for (int i=0; i<N; i++)
    arr[i] = malloc(M*sizeof(int));

在这两种情况下,您都可以使用arr作为二维数组(例如arr[1][2]=3)。但是,仅在第一种情况下,您可以安全地应用更大的复制操作,例如memset(arr,0,N*M*sizeof(int))

贾骏
2023-03-14

C中的多维数组是连续的。以下内容:

int m[4][5];

由4个int[5]s组成,它们在内存中相邻排列。

指针数组:

int *m[4];

是锯齿状的。每个指针可以指向(第一个元素)不同长度的单独数组。

< code>m[i][j]等价于< code>*(*(m i) j)。参见C11标准第6.5.2.1节:

下标运算符[]的定义是E1[E2]等于(*((E1)(E2)))

因此,< code>m[i][j]等价于< code>(*(m i))[j],后者等价于< code>*(*(m i) j)。

之所以存在这种等效性,是因为在大多数情况下,数组类型的表达式衰减到指向其第一个元素的指针(C11 标准,6.3.2.1)。m[i][j] 解释如下:

    < li> m是数组的数组,因此它衰减为指向第一个子数组< code>m[0]的指针。 < li> m i是指向< code>m的第< code>i子数组的指针。 < li> m[i]等效于< code>*(m i),取消引用指向< code>m的第< code>i个子数组的指针。由于这是一个数组类型的表达式,它衰减为指向< code>m[i][0]的指针。 < li> m[i][j]等效于< code>*(*(m i) j),取消引用指向< code>m的第< code>i子数组的第< code>j元素的指针。

请注意,指向数组的指针不同于指向其第一个元素的指针mi是指向数组的指针;它不是数组类型的表达式,无论是指向指针还是指向任何其他类型,它都不会衰减。

 类似资料:
  • 本文向大家介绍Java中的锯齿数组,包括了Java中的锯齿数组的使用技巧和注意事项,需要的朋友参考一下 锯齿状数组是一个多维数组,其中成员数组的大小不同。例如,我们可以创建一个2D数组,其中第一个数组包含3个元素,并且包含4个元素。以下是演示锯齿状数组概念的示例。 示例 输出结果

  • C 语言中的多维数组与我们在数学中学习到的多维数组是一致的。如果你还不知道什么是多维数组也没有关系。多维数组可以看成是之前学习过的数组的扩展。它能让你完成一些仅仅依靠一维数组没有办法完成的事情。让很多事情完成的更为简单。 1. 多维数组的声明 多维数组可以看作是一维数组的扩展。所以,它的声明就是在之前学习的数组,也叫一维数组,之后继续添加大括号,如果添加一组大括号,那么称之为二维数组,以此类推,就

  • 问题内容: 我们的作业要求我们使用锯齿状数组来存储二维布尔数组的值。锯齿状数组是否有内置的Java类,还是我必须使用ArrayLists数组手动创建它? 问题答案: 在Java中,二维数组是一维数组对象的数组。每个1D数组的长度可以不同,这意味着您可以立即使用锯齿状的数组。 例如,以下是完全有效的Java,并输出:

  • 主要内容:二维数组的初始化(赋值)上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为 一维数组。在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置。本节只介绍 二维数组,多维数组可由二维数组类推而得到。 二维数组的定义 二维数组定义的一般形式是: 其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length

  • Go语言中允许使用多维数组,因为数组属于值类型,所以多维数组的所有维度都会在创建时自动初始化零值,多维数组尤其适合管理具有父子关系或者与坐标系相关联的数据。 声明多维数组的语法如下所示: var array_name [size1][size2]...[sizen] array_type 其中,array_name 为数组的名字,array_type 为数组的类型,size1、size2 等等为数

  • Go 语言数组 Go 语言支持多维数组,以下为常用的多维数组声明方式: var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type 以下实例声明了三维的整型数组: var threedim [5][10][4]int 二维数组 二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的。二维数组定义方式如下: var arrayName