Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Это фуфловое преобразование.
А вот и нет
По крайней мере MVS 7.0 так не думает — все
компилит и резалты соответствующие.
Стоит тока поставить амперсент — начинается борода
Здравствуйте, SeriousSam, Вы писали:
SS>Hi! SS>Имеется такой код:
SS> char arr[8][8]; SS> char (*arr_p)[8][8];
SS> arr_p = ( char (*)[8][8])arr; // (1)
SS> (*arr_p)[0][0] = 0;
SS>Собственно вопрос: SS> почему строчка (1) выглядит не так: SS> arr_p = (char (*)[8][8])&arr;
вообще такими штуками можно и (int*) в (double*) превратить.
непонятно зачем явное приведение, если можно сделать просто (что по идее и должно стоять):
У меня тоже никто не ругается.
Имеем MVC 7.0
Если написать arr_p = (...)&arr, то
обращение через (*arr_p)[..][..] происходит совсем
не к членам массива arr, а отчет смещения происходит от самого arr_p.
А вот если же так — arr_p = (...)arr, то все ok.
Такое чувство, что разименования при (*arr_p) не происходит.
Это глюк MVC 7.0 ??
По-видимому потому, что при (T)expr к expr применяется стандартное преобразование array-to-pointer? SS>Тогда, получается, операция взятия адреса ( arr_p = &arr) SS>эквивалентна операции приведения к указателя??( arr_p = (char (*)[8][8])arr)
Похоже на то.
SS>А такое: arr_p = (char (*)[8][8])&arr — указатель на указатель??
Ну, если предположить наличие array — to — pointer преобразование, то это просто преобразование указателя в указатель — при этом хоть тип у них разный, значение родинаковое. Но все это верно при предположении, что к expr применяется array-to-pointer преобразование. А это можно проверить, например, так (если лениться и не искать в стандарте)
Спасибо за разъяснение, проверить экзампл сейчас не могу.
Но вся фишка в том, что (char (*)[8][8])arr != (char (*)[8][8])&arr.
Иначе бы и вопроса бы не возникло.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
SS>>Но вся фишка в том, что (char (*)[8][8])arr != (char (*)[8][8])&arr.
L_L>В том то и фишка, что равны.
Значит эта штука компиляторо-зависима.
Все, о чем я говорил, действительно для MVC 7.0.
Видно там преобразование arr_to_pointer делается просто
к rvalue(подразумевая под ним массив) и (char (*)[8][8])&arr
означает двухкратное выполнение преобразования.