使用算术解引用2D数组


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) );

相关内容

  • 没有找到相关文章

最新更新