Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вернуть 4ерез функцию массив 
V
    Опции темы
Fazil6
Дата 2.10.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Hroft @  2.10.2008,  09:04 Найти цитируемый пост)
двумерный массив как type **ptr.

вот тебе и говорят, что двумерный массив и указатель на указатель - это совершенно разные вещи и рассматривать int _lauta[8][8] как int** нельзя.
Цитата(J0ker @  1.10.2008,  18:52 Найти цитируемый пост)
т.о. типы эти несовместимы принципиально. Ну а синтаксически это просто РАЗНЫЕ типы... 
 +1

PM MAIL   Вверх
J0ker
Дата 2.10.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Hroft @ 2.10.2008,  09:04)
Цитата(kostay @  1.10.2008,  14:21 Найти цитируемый пост)
int _lauta[8][8]; //0,1,2
//potom zapolnjaem _lauta[i][j]...

int** Asema::getAsema(){
    return (int**)_lauta;
}



Цитата(J0ker @  1.10.2008,  18:52 Найти цитируемый пост)
если рассматривать type **ptr как двумерный массив


В данном конкретном случаем мы рассматриваем не type **ptr как двумерный массив, а двумерный массив как type **ptr. Это - частный случай, когда указатели указывают не на произвольные места в памяти, а на соседние. Я ошибаюсь?

ошибаетесь
type arr[x][y];
можно рассматрвать как type *ptr (однако синтаксически это разные типы и не могут быть присвоены напрямую)
например:
Код

int arr[8][10];
arr[5][6] = 12;
std::cout << arr[5][6] << std::endl;
int *ptr = reinterpret_cast<int*>(arr);
ptr[5*10+6] = 15;
std::cout << arr[5][6] << std::endl;

результат:
Код

12
15


т.е. при обращении к статическому двумерному массиву [x][y] смещение элемента [a][b] относительно начала вычисляется как (a*y+b)
если же мы обращаемся через [a][b] к типу type**, то происходит следующее:
1. [a] трактуются как обращение к элементу a массива из type* - т.е. это массив указателей, и полученный элеент это УКАЗАТЕЛЬ
2. [b] трактуется как обращение к элементу b массива из type с базовым адресом полученным на предыдущем шаге

иллюстрация:

int arr[2][4];
arr[1][2]------------------------------------+
                                             |
                                             V
<[0][0],[0][1],[0][2],[0][3],[1][0],[1][1],[1][2],[1][3]>

int **ptr;
ptr[1][2]
[1]---+
      |
      V 
<[0],[1],[2],[3],........
  |   |   |
  |   |   +--------------------------------+
  |   +---------------+            [2]     |
  +-> <[0],[1],....>  |             V      |
                      +-> <[0],[1],[2],..> |
                                           +-> <[0],[1],......>




Это сообщение отредактировал(а) J0ker - 2.10.2008, 17:23


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.