掌握 C 语言中的指针和多维数组
在C语言中,数组是存储在连续内存位置的相似类型值的集合。数组(一维或多维)中的每个元素都由一个或多个唯一整数索引标识。
另一方面,指针存储变量的地址。数组中第0个元素的地址是数组的指针。您可以使用“取消引用运算符”来访问指针引用的值。
您可以在 C 中声明一维、二维或多维数组。术语“维度”是指标识集合中元素所需的索引数量。
指针和一维数组
在一维数组中,每个元素都由一个整数标识:
<前>03前>这里,数字“1”位于第 0 个索引,“2”位于索引 1,依此类推。
存储第 0 个元素地址的变量是其指针 -
<前>12前>简单来说,数组的名称也指向第 0 个元素的地址。所以,你也可以使用这个表达式 -
<前>20前>示例
由于指针的值按数据类型的大小递增,因此“x++”将指针移动到数组中的下一个元素。
<前>34前>输出
当您运行此代码时,它将产生以下输出 -
<前>42前>指针和二维数组
如果说一维数组就像一个元素列表,那么二维数组就像一个表或矩阵。
二维数组中的元素可以被认为是按行和列逻辑排列的。因此,任何元素的位置由两个索引决定,即行号和列号。行索引和列索引都从“0”开始。
<前>51前>这样的数组表示为 -
可以注意到,表格排列只是逻辑表示。编译器分配一个连续字节块。在 C 中,数组分配是以行优先的方式完成的,这意味着元素以行方式读入数组。
在这里,我们声明一个三行四列的二维数组(第一个方括号中的数字始终指行数)为 -
<前>63前>编译器将以行顺序为上述二维数组分配内存。假设数组的第一个元素位于地址1000,并且“int”类型的大小为4字节,则数组的元素将获得以下分配的内存位置 -
我们将使用&运算符的地址将数组num的第一个元素的地址分配给指针ptr。
<前>75前>示例 1
如果指针加1,则指针移动到下一个地址。 “34”数组中的所有 12 个元素都可以在循环中访问,如下所示 -
<前>82前>输出
当您运行此代码时,它将产生以下输出 -
<前>92前>一般来说,数组任何元素的地址可以使用以下公式 -
<前>109前>在我们的 34 数组中,
<前>117前>可以参考上图,确认“arr[3][4]”的地址为1044。
示例 2
使用取消引用指针来获取该地址处的值。让我们使用这个公式在指针的帮助下遍历数组 -
<前>122前>输出
当您运行此代码时,它将产生以下输出 -
<前>136前>指针和三维数组
三维数组是二维数组的数组。这样的数组用三个下标声明 -
<前>149前>这个数组可以看作是“x”层表格,每个表格有“x”行和“y”列。
3D 数组的一个例子是 -
<前>152前>指向 3D 数组的指针可以声明为 -
<前>168前>知道数组本身的名称是第 0 个元素的地址,我们可以将 3D 数组的指针写为 -
<前>171前>每层“x”行和“y”列占据 -
<前>189前>字节数。假设分配给上面声明的 3D 数组“arr”的内存从地址 1000 开始,第二层(“i =1”)从 1000 + (3 3) 4 =1036 字节位置开始。
<前>199前>如果 JMAX 为行数,KMAX 为列数,则第 1 个切片的第 0 行第 0 列元素的地址为 -
<前>204前>获取第 i 个切片第 j 行第 k 列的元素值的公式可以为 -
<前>212前>示例:使用指针取消引用打印 3D 数组
让我们使用这个公式在指针解引用的帮助下打印 3D 数组 -
<前>222前>输出
当您运行此代码时,它将产生以下输出 -
<前>230前>一般来说,使用指针访问数组与使用下标表示访问数组非常相似。两者的主要区别在于数组的下标声明静态分配内存,而我们可以使用指针动态分配内存。
要将多维数组传递给函数,您需要使用指针而不是下标。然而,使用下标数组比使用指针更方便,这对于新学习者来说可能很困难。
C语言