使用指针表示法在C中访问多维数组

时间:2017-05-11 06:00:16

标签: c arrays pointers multidimensional-array

a 为10个整数的一维数组,如下所示

int a[10];

以及上面声明的数组表达式

a[i]

评估为 *(a + i),并提供存储在 i th 索引中的值,例如。

int a[5]={1,2,3,4,5};

这里 a [3] 被评估为 *(a + 3),其等于 4 ,即。存储在数组 a 3rd 索引处的元素值。 但是像这样的2D阵列

int b[2][3]={ {1,2,3},{4,5,6} };

(这里我认为2D数组b是1D数组的数组,即b是具有2个元素的1D数组,每个元素本身是3个int的1D数组) 如果我们使用带有数组名称的单个下标运算符

b[i]

i = 1的上述表达式给出了存储元素4的地址,所以

  1. 如果b是2D数组,如何评估表达式 b [i]
  2. 如果b是2D数组,如何评估表达式 b [i] [j]
  3. 如何使用指针访问C中的多维数组元素。在这里,我想了解编译器如何在内部处理多维数组?
  4. 如果 b 是2D数组, b 会评估什么?

2 个答案:

答案 0 :(得分:4)

可以将2D数组视为数组数组,换句话说,可以将数组视为元素。例如,

int x[10];

是一个包含10 int s的数组。类似地,

int x[10][10];

可以看作是一个包含10个数组的数组,每个数组包含10个int s。

  

如果b是2D数组,如何计算表达式b[i]

b是2D数组时,b也是指向数组第一个元素的指针。因此,b[i]被评估为*(b+i),并提供i的{​​{1}}元素(换句话说,数组)的地址,这与地址相同b数组的第一个元素。

  

如果b是2D数组,如何计算表达式i

b[i][j]评估为b[i][j]。这表示选择*(*(b+i) + j)的{​​{1}}元素(换句话说,i行),并从中选择b元素(换句话说,第i栏。)

  

如何使用指针访问C中的多维数组元素。

考虑使用指针j,它已被动态分配并显示在某个内存部分,或者只是一个2D数组j。然后,您可以使用int **xint[ROWS][COLS]访问任何元素,其中*(*(x+i) + j)是行,x[i][j]是列。

但请注意, 双指针与2D数组 不同。

  

如果i是2D数组,j评估的内容是什么?

b是2D数组时,b也是指向数组第一个元素的指针。因此它与b以及b相同。

答案 1 :(得分:4)

  

这里我认为2D数组b是1D数组的数组

这是解决这个问题的正确方法,因为它确实是这样的。 C标准实际上并没有将多维数组指定为某种特殊情况,但它们很可能,因为数组类似于任何其他类型。所以我们可以有一个数组数组。

  
      
  1. 当b是2D数组时,如何计算表达式b [i]?   ...      
        
    1. 如果b是2D数组,b会评估什么?
    2.   
  2.   

对于任何数组,b在表达式中使用时,会衰减为指向第一个元素的指针。因此b[i]等同于*(b+i),与任何其他数组表达式相同。

在这种情况下,b会衰变为int(*)[3]类型的数组指针

  
      
  1. 在b是2D阵列的情况下,如何评估表达式b [i] [j]?
  2.   
  • b用在表达式中,所以在这个表达式中它会衰变为指向第一个元素的指针,该元素是指向第一个数组的数组指针。
  • b[i]导致指针算法应用于数组指针,相当于*(b+i)。这给出了数组i
  • 在这个位置,我们有一个int[3]类型的一维数组。由于此数组是另一个数组的一部分,因此它本身没有标识符。但为了便于说明,我们假装它得到一个临时名称“tmp”。然后,我们将使用tmp[j]表达式,它始终衰减为*(tmp+j),从而产生int

基本上整个表达式可以视为*(*(b+i) + j)

  
      
  1. 如何使用指针访问C中的多维数组元素。我想了解编译器如何在内部处理多维数组?
  2.   

如上所述,它将其视为数组数组。例如,您可以使用数组指针迭代2D数组:

#include <stdio.h>

void print_array (int array[3])
{
  printf("%d %d %d\n", array[0], array[1], array[2]);
}

int main (void)
{
  int b[2][3]={ {1,2,3},{4,5,6} };
  const size_t b_size = sizeof b / sizeof *b;

  for(int(*ptr)[3] = b; ptr < b+b_size; ptr++)
  {
    print_array(*ptr);
  }
}