int main(void)
{
short arr[3][2]={3,5,11,14,17,20};
printf("%d %d",*(arr+1)[1],**(arr+2));
return 0;
}
嗨。在上面的代码中,根据我的理解,*(arr+1)[1]
等于*(*(arr+sizeof(1D array)*1)+sizeof(short)*1)=>arr[1][1]
,即14。但是程序输出是arr[2][0]。有人能解释一下如何取消引用数组第二次增加sizeof(1array)即*(*(arr+sizeof(1D array)*1)+sizeof(1D array)*1)=>arr[2][0]
来自C标准(6.5.2.1数组下标)
2一个后缀表达式后跟一个方括号中的表达式[]是数组对象的元素的下标指定。的下标操作符[]的定义是E1[E2]与(* ((E1) + (E2)))。的转换规则二进制+操作符,如果E1是数组对象(相当于指针)为数组对象的初始元素),E2为整数,E1[E2]表示E1的第E2个元素(从0开始计数)。
所以表达式
*(arr+1)[1]
可以重写为
* ( *( arr + 1 + 1 ) )
等于
*( *( arr + 2 ) )
arr + 2指向第三行数组的。对指针表达式解引用,您将得到"行"。在表达式*( arr[2] )
中使用的类型short[2]
的本身被转换为指向其第一个元素的指针。因此,等价于arr[2][0]
的表达式得到的值为17。
因此这两个表达式
*(arr+1)[1],
和
**(arr+2)
是等价的
注意:注意你的代码中有一个错别字
printf("%d %d",*(arr+1)[1],**(arr+2);
再加一个括号
printf("%d %d",*(arr+1)[1],**(arr+2) );