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

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

int a[10]; 

并为上面声明的数组表达式

 a[i] 

被评估为*(a + i)并给出存储在第i索引处的值,例如

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

这里a [3]被评估为*(a + 3) ,它等于4 ,即存储在数组a的 第3个索引处的元素的值。 但是像这样的2Darrays的情况

 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会评估什么?

在这里我想2Darraysb作为一维arrays的数组

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

  1. 在b是2D数组的情况下,如何计算表达式b [i]?
    1. 如果b是2D数组,b会评估什么?

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

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

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

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

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

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

 #include  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); } } 

2D数组可以被认为是数组的数组,或者换句话说,是具有数组作为元素的数组。 例如,

 int x[10]; 

是一个包含10个int的数组。 同样的,

 int x[10][10]; 

可以认为是一个包含10个数组的数组,每个数组包含10个int


在b是2D数组的情况下,如何计算表达式b[i]

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

在b是2D数组的情况下,如何计算表达式b[i][j]

b[i][j]被评估为*(*(b+i) + j) 。 这表示选择bi个元素(换句话说,第i行),并由此选择第j个元素(换句话说,第j个列)。

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

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

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

如果b是2D数组, b计算结果是什么?

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