让 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的地址,所以
答案 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 **x
或int[ROWS][COLS]
访问任何元素,其中*(*(x+i) + j)
是行,x[i][j]
是列。
但请注意, 双指针与2D数组 不同。
如果
i
是2D数组,j
评估的内容是什么?
当b
是2D数组时,b
也是指向数组第一个元素的指针。因此它与b
以及b
相同。
答案 1 :(得分:4)
这里我认为2D数组b是1D数组的数组
这是解决这个问题的正确方法,因为它确实是这样的。 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]
类型的一维数组。由于此数组是另一个数组的一部分,因此它本身没有标识符。但为了便于说明,我们假装它得到一个临时名称“tmp
”。然后,我们将使用tmp[j]
表达式,它始终衰减为*(tmp+j)
,从而产生int
。基本上整个表达式可以视为*(*(b+i) + j)
。
- 如何使用指针访问C中的多维数组元素。我想了解编译器如何在内部处理多维数组?
醇>
如上所述,它将其视为数组数组。例如,您可以使用数组指针迭代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);
}
}