使用指针表示法在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的地址,所以
- 在b是2D数组的情况下,如何计算表达式b [i] ?
- 在b是2D数组的情况下,如何计算表达式b [i] [j] ?
- 如何使用指针访问C中的多维数组元素。 在这里,我想了解编译器如何在内部处理多维数组?
- 如果b是2D数组, b会评估什么?
在这里我想2Darraysb作为一维arrays的数组
这是解决这个问题的正确方法,因为它确实是这样的。 C标准实际上并没有将多维数组指定为一些特殊情况,但它们很可能,因为数组类似于任何其他类型。 所以我们可以有一个数组数组。
- 在b是2D数组的情况下,如何计算表达式b [i]?
…
- 如果b是2D数组,b会评估什么?
对于任何数组, b
在表达式中使用时,衰减为指向第一个元素的指针。 因此,对于任何其他数组表达式, b[i]
等效于*(b+i)
。
在这种情况下, b
衰变为int(*)[3]
类型的数组指针 。
- 在b是2D数组的情况下,如何计算表达式b [i] [j]?
-
b
用在表达式中,所以在这个表达式中它会衰减成指向第一个元素的指针,第一个元素是指向第一个数组的数组指针。 -
b[i]
使指针算法应用于数组指针,相当于*(b+i)
。 这给出了数组i
。 - 在这个位置,我们有一个
int[3]
类型的一维数组int[3]
。 由于此数组是另一个数组的一部分,因此它本身没有标识符。 但为了说明,我们假装它得到一个临时名称“tmp
”。 然后我们将得到表达式tmp[j]
,它总是衰减成*(tmp+j)
,从而产生一个int
。
基本上整个表达式可以被视为*(*(b+i) + j)
。
- 如何使用指针访问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)
。 这表示选择b
第i
个元素(换句话说,第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]
。