访问二维数组与指针给出错误

时间:2017-03-03 16:34:17

标签: c arrays pointers

  private class DisabledColorDecorator implements DayDecorator {
    @Override
    public void decorate(DayView dayView) {

        SimpleDateFormat curFormater = new SimpleDateFormat("dd/MM/yyyy");

        if (CalendarUtils.isPastDay(dayView.getDate())) {
            int color = Color.parseColor("#a9afb9");
            dayView.setBackgroundColor(color);
        }


        for (int i =0; i<bookDates.size();i++) {
            try {
                if (curFormater.parse(bookDates.get(i))== dayView.getDate())       {
                    int color = Color.parseColor("#a9afb9");
                    dayView.setBackgroundColor(color);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

    }
}

我不明白为什么最后一个给我一个错误而前一个错误。 Int arr[2][4], *p; p = &arr[0][0]; *(p + 2) = 10; //ok *(p + 5) = 20;// ok *(*(arr + 1) + 3) = 15;//ok *(*(p + 1) + 3) = 15;// error 等于p,为什么它不起作用?

2 个答案:

答案 0 :(得分:0)

arrint (*)[4]的表达式*(*(arr + 1) + 3) = 15;*(arr + 1)的{​​{1}}类型中(在数组到指针转换之后),因此取消引用运算符可以是适用于它。另一方面,int *属于p类型。 int *的类型为*(p + 1),您无法对其应用解除引用运算符。

答案 1 :(得分:0)

表达式中的数组转换为指向其第一个元素的指针。

因此,表达式(在子表达式arrarr + 1中的数组*(*(arr + 1) + 3)将转换为类型为int ( * )[4]的指针。反过来,子表达式arr + 1也具有相同的类型。子表达式*(arr + 1)生成一个类型为int[4]的对象,该对象又转换为指向其第一个元素的指针,其类型为int *。所以你可以取消引用这个指针,如

*(*(arr + 1) + 3) = 15;//ok 

指针p的类型为int *因此,此子表达式*(p + 1)的类型为int,可能无法进一步解除引用。

比较这些一个在另一个下面写的语句

  *(p + 2) = 10;  
*(*(p + 1) + 3) = 15; 

从第一个声明可以看出*(p + 2)的类型为int。因此,取消引用同样具有*(p + 1) + 3类型的int表达式并不具有男性意义。