Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чисто филосовский вопрос


Автор: mrbrooks 19.12.2006, 16:28
Комрады я вот не догоняю в чем проблема 
если сделать так:
int arr[5][5], * parr;

parr = &arr[0][0];

компилятор утверждает что я реальный пацан, но если 

parr = arr; 

посылает меня к чертовой матери. Парадокс!

Автор: bsa 19.12.2006, 16:37
Все правильно.
arr - это указатель на int[5] (на массив из массивов из пяти интов)
а parr - это указатель на массив из интов
тебе нужно объявлять parr, как int *(par[5]) (или без скобок, проверять лень, а подобные конструкции никогда не использую, так как ненужны).

Автор: mrbrooks 19.12.2006, 17:55
гыгы. комрад bsa вы опустили профессора Хомоненко. Это его фишка - мол если с одномерными работает так то и с многомерными будет по анологии. 

Автор: Solomon 19.12.2006, 17:58
Цитата(bsa @  19.12.2006,  15:37 Найти цитируемый пост)
тебе нужно объявлять parr, как int *(par[5]) (или без скобок, проверять лень, а подобные конструкции никогда не использую, так как


это не изменит ниче. Вопрос не втом то был.


mrbrooks, у тебя parr это указатель, ему нельзя присвоить значение переменной, ему присваивается адресс переменной с помощью оператора &.(как ты делаеш в первом случае). А во втором случае получается parr ждет адресс в памяти, а ты ему пытаешся впихнуть значение переменно. вот и матюгается

Добавлено @ 17:59 
mrbrooks, или я неправельно вопроспонял?  smile 

Автор: Partizan 19.12.2006, 18:02
[censored 6]....
Код

int arr1[5][5];// int **arr1
int *arr2;
int x;

arr2 = &x//указывает на int...что и было написано при задании типа...
arr2 = arr1 //указывает на int* то бишь либо arr2 у нас должен иметь тип int **...либо  arr1 надо преобразовывать...например так arr2 = ( int* ) arr1;
 


и ничто не мешает нам это сделать....(я о преобразовании arr2 = (int*) arr1)
ибо что здесь что там должен лежать адрес....

Добавлено @ 18:04 
Цитата(Solomon @ 19.12.2006,  17:58)
 А во втором случае получается parr ждет адресс в памяти, а ты ему пытаешся впихнуть значение переменно. вот и матюгается

а вот и нет...
во втором случае arr = это адрес переменной с индексами [0][0] ака начало массива...

Автор: Xenon 19.12.2006, 18:15
Partizan, то есть по-твоему это должно работать?
Код

    int arr[5][5];
    int** parr;
    parr=arr;


Код

error C2440: '=' : cannot convert from 'int [5][5]' to 'int **'

Автор: Partizan 19.12.2006, 18:31
Xenon, всё правильно...ошибка с моей стороны...

Автор: FunnyFalcon 19.12.2006, 18:32
Код

    int arr[5][5];
    int (*parr)[5];
    parr=arr;

А так?

Автор: mrbrooks 19.12.2006, 20:05
To Solomon
В документации сказано что при работе с массивами и указателями код (к примеру) имеет вид:

int mass[5][5],*parr;

либо  parr = &mass[0][0] либо parr = mass -  что типа одно и то же - компилятор так должен это воспринимать. Дескать начало массива. Здесь коллега Partizan абсолютно прав. Иначе спорить прошу к старине Бьерну =).

Вот для массива:

int mass[5],*parr;

и parr = mass и parr = &mass[0] - действует безотказно.

To FunnyFalcon

Хорошая идея. Стоит попробывать.

Автор: mrbrooks 19.12.2006, 20:51
To FunnyFalcon & bsa и конечно же Partizan!
 Спасибо за советы! Все получилось! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)