C-指针和二维数组

时间:2020-02-23 14:31:59  来源:igfitidea点击:

在本教程中,我们将学习使用C编程语言中的指针来处理二维数组。

在上一教程"指针和一维数组"中,我们学习了如何使用一维字符数组。
随时查看该教程。

创建一个二维数组

为了简单起见,我们将创建一个二维整数数组" num",该数组具有3行4列。

int num[3][4] = {
  {1, 2,  3,  4},
  {5, 6,  7,  8},
  {9, 10, 11, 12}
};

在上图中,我们显示了具有3行4列的二维数组。

编译器将按行为上述二维数组分配内存,这意味着第二行的第一个元素将放置在第一行的最后一个元素之后。

而且,如果我们假设数组的第一个元素在地址1000处并且类型为int的大小为2个字节,则数组的元素将获得以下分配的内存位置。

创建二维数组的指针

我们已经创建了二维整数数组" num",因此我们的指针也将是" int"类型。

我们将使用"&"运算符的地址将数组" num"的第一个元素的地址分配给指针" ptr"。

int *ptr = &num[0][0];

通过指针访问二维数组的元素

二维数组" num"将作为连续块保存在内存中。
因此,如果将ptr的值增加1,我们将移至分配的内存中的下一个块。

在下面的代码中,我们使用" for"循环并通过增加" ptr"的值来打印" num"数组的内容。

#include <stdio.h>

int main(void) {
  
  //2d array
  int num[3][4] = {
    {1, 2,  3,  4},
    {5, 6,  7,  8},
    {9, 10, 11, 12}
  };

  //pointer ptr pointing at array num
  int *ptr = &num[0][0];
  
  //other variables
  int
    ROWS = 3,
    COLS = 4,
    TOTAL_CELLS = ROWS * COLS,
    i;
  
  //print the elements of the array num via pointer ptr
  for (i = 0; i < TOTAL_CELLS; i++) {
    printf("%d ", *(ptr + i));
  }
  
  return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12

地址映射

我们可以通过使用数组的行和列来计算数组元素的地址。
为此,我们使用以下公式。

arr[i][j] = baseAddress + [(i x no_of_cols + j) x size_of_data_type]

其中," arr"是二维数组。
i和j表示数组的第i行和第j列。

baseAddress表示数组的第一个元素的地址。
而" no_of_cols"是该行中的总列数。

而size_of_data_type是指针类型的大小。
如果类型为" int",则size_of_data_type = 2个字节,如果类型为" char",则size_of_data_type = 1个字节。

例如,对于" num"数组,baseAddress = 1000,no_of_cols = 4,size_of_data_type = 2。

因此,我们可以如下计算元素num [2] [3]的内存地址位置。

//address of element at cell 2,3
num[2][3] = baseAddress + [(i x no_of_cols + j) x size_of_data_type]
          = 1000 + [(2 x 4 + 3) x 2]
          = 1000 + [(8 + 3) x 2]
          = 1000 + 22
          = 1022

通过使用数组的行和列的指针访问二维数组的值

如果要在数组的任何给定行,列中获取值,则可以在" *"运算符的地址和以下公式中使用该值。

arr[i][j] = *(ptr + (i x no_of_cols + j))

其中," arr"是二维数组," i"和" j"表示数组的第i行和第j列。

ptr保存数组第一个元素的地址。

no_of_cols表示数组行中的列总数。

在下面的示例中,我们在数组num的第二行和第三列的位置找到值。

//value at num[2][3] where, i = 2 and j = 3
num[2][3] = *(ptr + (i x no_of_cols + j))
          = *(ptr + (2 x 4 + 3))
          = *(ptr + 11)

完整的代码

#include <stdio.h>

int main(void) {
  
  //2d array
  int num[3][4] = {
    {1, 2,  3,  4},
    {5, 6,  7,  8},
    {9, 10, 11, 12}
  };
  
  int
    ROWS = 3,
    COLS = 4,
    i, j;

  //pointer
  int *ptr = &num[0][0];
  
  //print the element of the array via pointer ptr
  for (i = 0; i < ROWS; i++) {
    for (j = 0; j < COLS; j++) {
      printf("%d ", *(ptr + i * COLS + j));
    }
    printf("\n");
  }
  
  return 0;
}
1 2 3 4
5 6 7 8
9 10 11 12