指针:给定上下文中*和(int *)之间的差异

时间:2014-07-09 06:13:54

标签: c pointers

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 *)而不是*放在一起,我就无法弄清楚它有什么不同,因为数组是整数类型。

2 个答案:

答案 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]