int ar[3][3]={{1,2,3},{4,5,6},{7,8,9}};
statment1: int k=(int *)((int *)(ar+1)+2);
statment2: int l=*(*(ar+1)+2);
statement3 int *p = (int *)a +1;
Statement1无法编译。
Statement2和Statement3编译。
现在,如果我将(int *)
而不是*
放在一起,我就无法弄清楚它有什么不同,因为数组是整数类型。
答案 0 :(得分:0)
您对取消引用运算符*
和强制转换操作(int *)
感到困惑,而您的第一行应该响铃:
int k = (int *)bar;
您尝试影响int
变量中的地址(指向int
)。
第二个没问题,因为您使用*
两次来获取二维数组中的值。
第三个也没关系,因为您的容器int * p
具有正确的类型来获取地址(并且您只需取消引用"一个维度"。
我希望它足够清楚,无论如何你可以查看这篇Wikipedia文章中的解除引用运算符。
答案 1 :(得分:0)
混淆出现在这一行,其中使用了指针而不是数组索引:
statment1: int k=(int *)((int *)(ar+1)+2);
看起来意思是ar[1][2]
但是,这不是他们所拥有的。为了创建ar[1][2]
索引的等效指针表示,它将是:
statment1: int k = *(*(ar + 1) + 2) // equivalent to k = ar[1][2]