Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 10:53
Оценка:
Hi!
Имеется такой код:

char arr[8][8];
char (*arr_p)[8][8];

arr_p = ( char (*)[8][8])arr; // (1)

(*arr_p)[0][0] = 0;

Собственно вопрос:
почему строчка (1) выглядит не так:
arr_p = (char (*)[8][8])&arr;
Re: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 10:56
Оценка:
Это фуфловое преобразование.

Строчка 1 должнa выглядеть так
char (*arr_p)[8][8] = &arr;
Of course, the code must be complete enough to compile and link.
Re[2]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 11:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Это фуфловое преобразование.

А вот и нет
По крайней мере MVS 7.0 так не думает — все
компилит и резалты соответствующие.
Стоит тока поставить амперсент — начинается борода
Re: Указатель на массив
От: Ovl Россия  
Дата: 06.09.04 11:43
Оценка:
Здравствуйте, 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*) превратить.
непонятно зачем явное приведение, если можно сделать просто (что по идее и должно стоять):

arr_p = &arr;


у меня vs не ругается.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 11:52
Оценка:
У меня тоже никто не ругается.
Имеем MVC 7.0
Если написать arr_p = (...)&arr, то
обращение через (*arr_p)[..][..] происходит совсем
не к членам массива arr, а отчет смещения происходит от самого arr_p.
А вот если же так — arr_p = (...)arr, то все ok.
Такое чувство, что разименования при (*arr_p) не происходит.
Это глюк MVC 7.0 ??
Re[3]: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 12:41
Оценка:
Еще раз. Никакого преобразования не нужно, достаточно писать
arr_p = &arr;
Of course, the code must be complete enough to compile and link.
Re[4]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 12:57
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Еще раз. Никакого преобразования не нужно, достаточно писать

L_L>
L_L>arr_p = &arr;
L_L>


Да причем тут преобразование!!
Оно тут просто так проскочило, для порядку...
Проблема в том, что НЕ происходит разименования:

char arr[8][8]; // (int*)arr = 0x20000
char (*arr_p)[8][8] = &arr; // arr_p = 0x30000
char c;


c = arr[0][0]; // обращение к 0x20000
c = (*arr_p)[0][0]; // обращение к 0x30000 <<<<< ??????????

arr_p = arr;
c = (*arr_p)[0][0]; // обращение к 0x20000 <<<<< ??????????

Результаты получены опытным путем.
Re[5]: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 13:08
Оценка:
SS>Да причем тут преобразование!!
При том, что оно не нужно.


SS>Результаты получены опытным путем.


#include <iostream>

int main()
{
   char arr[8][8] = {'a'};
   char (*arr_p)[8][8] = &arr;
   
   std::cout<<arr_p<<" "<<" "<<(char (*)[8][8])arr<<std::endl;
}


Я получаю (vc 6.0) два ОДИНАКОВЫХ адреса
Of course, the code must be complete enough to compile and link.
Re[6]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 13:16
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:


SS>>Да причем тут преобразование!!

L_L>При том, что оно не нужно.
Оно необязательно.
Можно ведь написать
int a, *p;
p = (int*)&a;
Тут тоже самое.


SS>>Результаты получены опытным путем.


L_L>
L_L>#include <iostream>

L_L>int main()
L_L>{
L_L>   char arr[8][8] = {'a'};
L_L>   char (*arr_p)[8][8] = &arr;
   
L_L>   std::cout<<arr_p<<" "<<" "<<(char (*)[8][8])arr<<std::endl;
L_L>}

L_L>


L_L>Я получаю (vc 6.0) два ОДИНАКОВЫХ адреса

Почему??
Тогда, получается, операция взятия адреса ( arr_p = &arr)
эквивалентна операции приведения к указателя??( arr_p = (char (*)[8][8])arr)
А такое: arr_p = (char (*)[8][8])&arr — указатель на указатель??

Что-то я о таком не слышал...
Re[7]: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 13:23
Оценка:
SS>Почему??

По-видимому потому, что при (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 a[8][8] = {};
char (*pa)[8] = static_cast<char (*)[8]>(a);
Of course, the code must be complete enough to compile and link.
Re[8]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 13:29
Оценка:
Спасибо за разъяснение, проверить экзампл сейчас не могу.
Но вся фишка в том, что (char (*)[8][8])arr != (char (*)[8][8])&arr.
Иначе бы и вопроса бы не возникло.
Re[9]: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 13:31
Оценка:
SS>Но вся фишка в том, что (char (*)[8][8])arr != (char (*)[8][8])&arr.

В том то и фишка, что равны.
Of course, the code must be complete enough to compile and link.
Re[10]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 13:40
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

SS>>Но вся фишка в том, что (char (*)[8][8])arr != (char (*)[8][8])&arr.


L_L>В том то и фишка, что равны.


Значит эта штука компиляторо-зависима.
Все, о чем я говорил, действительно для MVC 7.0.
Видно там преобразование arr_to_pointer делается просто
к rvalue(подразумевая под ним массив) и (char (*)[8][8])&arr
означает двухкратное выполнение преобразования.
Re[11]: Указатель на массив
От: Lorenzo_LAMAS  
Дата: 06.09.04 13:58
Оценка: :)
Я вот не поленюсь и сегодня поставлю VC 7.0.
Of course, the code must be complete enough to compile and link.
Re[12]: Указатель на массив
От: SeriousSam Россия null
Дата: 06.09.04 14:08
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Я вот не поленюсь и сегодня поставлю VC 7.0.


Вот и правильно
Я такое один не могу наблюдать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.