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 *和+评估的优先级。
答案 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号
编辑:
抱歉,对于一些错误的陈述。我考虑了注释,我需要补充一点,在上面的例子中,数组类型的左值表达式被隐式转换为指向其第一个元素的指针。