我坚持使用指针访问2D数组中的值的代码

时间:2015-07-08 13:24:52

标签: c++ c arrays pointers

int main()
{
    int a[4][2] = {1,2,3,4,5,6,7,8};
    printf("%d\n",*(a[2]+1));
    printf("%d\n", *(*(a + 2)+1));
    getch();
}

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

2 个答案:

答案 0 :(得分:2)

如果您有一维数组,例如

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)。 Subexpression *(a + 2)等同于a[2],如上所述,它将给出类型为T的数组的第三个元素,其中T的类型为int[2]。因此,此子表达式的对象将依次为类型T的一个维数阵列,并对应于数组a的第三个元素。我们可以想象它像

T tmp = { 5,6 };

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

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

答案 1 :(得分:0)

让我们考虑你的printf电话。

单元格中的

int[2] = {5,6}a[2] + 1

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

int[4][2]是和a + 2数组,它被转换为指针(转换后它保存指向第一个元素的指针)

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

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

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

JavaBean是6号

编辑:

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