我被使用指针访问 2D 数组中的值的代码所困扰

I am stucked with this code of accessing values in 2D array using pointers

本文关键字:代码 数组 指针 2D 访问      更新时间:2023-10-16
int main()
{
    int a[4][2] = {1,2,3,4,5,6,7,8};
    printf("%dn",*(a[2]+1));
    printf("%dn", *(*(a + 2)+1));
    getch();
}

二维数组可以被认为是一维数组。
该程序的输出在两个 printf 中均为 6。我的问题是printf("%dn", *(*(a + 2)+1));如何执行以及星号*和+评估的优先级如何。

例如,

如果你有一个一维数组

int a[] = { 5, 6 };

则表达式 a[1] 等效于表达式 *( a + 1 ) 并产生数组的第二个元素,等于 6

示例中的数组a

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

为了清楚起见,可以按以下方式重写

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

您还可以为数组引入 typedef 名称

typedef int T[2];

其中名称T表示类型 int[2]

使用此 typedef,您可以通过以下方式重写原始数组的声明(可以省略初始化(

T a[4];

现在让我们考虑表达式*(*(a + 2)+1)。子表达式 *(a + 2) 等效于 a[2],如上所述,将给出类型 T 数组的第三个元素,其中 T 的类型为 int[2] 。因此,此子表达式的对象将依次是一个类型为 T 的 dimensioanl 数组,并对应于数组 a 的第三个元素。我们可以想象它像

T tmp = { 5,6 };

int tmp[2] = { 5,6 };

因此,表达式*(*(a + 2)+1)等价于表达式*( tmp + 1 )等价于tmp[1],并将产生这个可想象的数组tmp的第二个元素。那就是你会得到6.

让我们考虑一下您的两个 printf 调用。

单元格中的a[2] int[2] = {5,6}

a[2] + 1 是一个包含数字 6 地址的指针(a[2] 隐式转换为指针(,因此在取消引用后它是 6。

a is 和 int[4][2] 数组,该数组被转换为指针(转换后它保留指向第一个元素的指针(

a + 2是一个指针,它保存指向数字 5 的指针地址

*(a + 2) 是一个包含数字 5 地址的指针

*(a + 2) + 1 是一个包含数字 6 地址的指针

*(*(a + 2) + 1)是第6位

编辑:

对不起,对于一些错误的陈述。我考虑了注释,我需要补充一点,在上面的示例中,数组类型的 lvalue 表达式被隐式转换为指向其第一个元素的指针。

相关文章: