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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерные массивы и указатели, Как получить адрес элемента массива 
V
    Опции темы
Ln78
Дата 26.4.2007, 13:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 13
Всего: 15



FiMa1, не так.
Для первого раза можно так
Код

#define N1 4
#define N2 5
#define N3 6
//      const int N1=4,N2=5,N3=6; //Для C++ лучше не через define а так
      int A[N1][N2][N3];
      int *p = (int *)A;
      int i=1,j=2,k=3;
      A[i][j][k]=123;
      p[(i*N1+j)*N2+k]=321;

На эту тему есть много хороших книг. Если очень нужно, могу попробовать написать для тебя небольшое пояснение, но только позже

Добавлено через 6 минут и 56 секунд
Ну вот, и сам ошибся, надо
 
Код

    p[(i*N2+j)*N3+k]=321;

PM MAIL   Вверх
FiMa1
Дата 26.4.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 6



Цитата
На эту тему есть много хороших книг.

Название книги в студию, пли-и-и-з. Правда сам не нашел именно про это нигде, уж извините...
Цитата
Если очень нужно, могу попробовать написать для тебя небольшое пояснение, но только позже

Спасибо, буду ждать!
PM   Вверх
apook
Дата 26.4.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include<stdio.h>
#include<conio.h>

int main(void)
{
    int a[3][3][3] = { { { 111, 112, 113 }, { 121, 122, 123 }, { 131, 132, 133 } },
                       { { 211, 212, 213 }, { 221, 222, 223 }, { 231, 232, 233 } },
                       { { 311, 312, 313 }, { 321, 322, 323 }, { 331, 332, 333 } } };

int i, j, c;

for( i=0; i<3; i++ )
{
    for( j=0; j<3; j++ )
    {
        for( c=0; c<3; c++ )
            printf( " %d", *(*(*(a+i)+j)+c) );
        printf( "\t" );
        }
    printf( "\n" );
    }

getch();
}



Код

      A[i][j][k]=123;
      p[(i*N1+j)*N2+k]=321;

Ln78 Это что-то в натуре интересное, подозреваю что ты еще один запутыватель
ты не преподавателем работаешь нет... а то похоже


Это сообщение отредактировал(а) apook - 26.4.2007, 14:24


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Anikmar
Дата 26.4.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



FiMa1, Имейте в виду

Вариант Ln78 только для массива, занимающего единый блок памяти (только для статики).
Вариант apook универсальный - сработает и на статическом масиве и на динамическом. - Я бы выбрал его.

PM MAIL ICQ   Вверх
FiMa1
Дата 26.4.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 6



Цитата(apook @ 26.4.2007,  14:12)
Код

...
            printf( " %d", *(*(*(a+i)+j)+c) );
...

Так я, кажется, тоже самое написал в строке:
Код
int thirdElem = *(*(*(a + 0) + 1) + 2);

apook, получается Ln78 меня не правильно поправил?

PS: to apook: а как С ПОМОЩЬЮ УКАЗАТЕЛЕЙ динамически разместить данный массив в памяти и, С ПОМОЩЬЮ УКАЗАТЕЛЕЙ, реализовать инициализацию не показал (ну и удаление массива само собой). Просвяти, плз. Заранее спасибо!
PM   Вверх
JackYF
Дата 26.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(FiMa1 @  26.4.2007,  13:19 Найти цитируемый пост)
int thirdElem = *(*(*(a + 0) + 1) + 2);

Кажись, да.

Цитата(Anikmar @  26.4.2007,  09:04 Найти цитируемый пост)
А вот дальше я не понял. У нас есть только указатели. И сы создаем по одному элементу. А где используется третья размерность? В примере она tdim. Я ее не увидел. Получается по 3-му измерению у вас создается только 1 элемент. 


Все, понял, где я недописал... да, тогда действительно была ошибка.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
apook
Дата 26.4.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

apook, получается Ln78 меня не правильно поправил?

Дело в том что он не поправил, а привел пример абсолютно не пвносящий ясность в твой вопрос, а где то даже наоборот.
Цитата

а как С ПОМОЩЬЮ УКАЗАТЕЛЕЙ динамически разместить данный массив в памяти и, С ПОМОЩЬЮ УКАЗАТЕЛЕЙ, реализовать инициализацию

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

Но все-же скажу как сделал-бы apook. Пишешь просто на индексах, компелируешь, убираешь баги, любуешся, переделываешь на указатели, смотришь
и думаешь нахрена ведь и так работало...

Если a[0] это *(a) то a[0][0] это *(*(a)) ну и т.д
Короче от простого пляшем, от простого к сложному как сказал кто-то, ведь знал же что говорил....


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
likehood
Дата 26.4.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



Цитата(apook @  26.4.2007,  16:13 Найти цитируемый пост)
Дело в том что он не поправил, а привел пример абсолютно не пвносящий ясность в твой вопрос, а где то даже наоборот.

Он показал, как этот код работает на самом деле. А использование тройного разименования как раз и запутывает мозги.

Цитата(Ln78 @  26.4.2007,  14:50 Найти цитируемый пост)
      
Код

A[i][j][k]=123;      p[(i*N1+j)*N2+k]=321;

а вот здесь действительно что-то напутано

Это сообщение отредактировал(а) likehood - 26.4.2007, 15:24
PM MAIL   Вверх
Anikmar
Дата 26.4.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(FiMa1 @  26.4.2007,  13:19 Найти цитируемый пост)
Да через указатели, но не "явно"...
Пусть есть одномерный массив int a[3]; тогда доступ к третьему (фактически второму, нумерация с нуля) элементу массива при явной записи с использованием указателей будет выглядеть как:


Цитата(FiMa1 @  26.4.2007,  14:28 Найти цитируемый пост)
PS: to apook: а как С ПОМОЩЬЮ УКАЗАТЕЛЕЙ динамически разместить данный массив в памяти и, С ПОМОЩЬЮ УКАЗАТЕЛЕЙ, реализовать инициализацию не показал (ну и удаление массива само собой). Просвяти, плз. Заранее спасибо! 


Так вы определитесь пожалуйста.
Чем мой пример вам не подходит?
Создание трехмерного массива - есть
Присвоение элементам через указатели - есть
Удаление - есть

А если вы определяете массив статически, то как тогда вы планируете его еще раз создать? И как уничтожить? 
Если он статический - он уже создан и он сам уничтожется при выходе из программы.
PM MAIL ICQ   Вверх
apook
Дата 26.4.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



likehood
Компилятор встретив a[1] делает следующее *(a+1) стало быть так этот код работает на самом деле
Способ с указателями я привел только потому что Fima1 с самого начала на этом настаивает(читай предыдущие посты)
И отнють не говорю что это вносящий ясность способ.


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
FiMa1
Дата 26.4.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 6



Цитата(Anikmar @ 26.4.2007,  16:00)
Так вы определитесь пожалуйста.
Чем мой пример вам не подходит?
Создание трехмерного массива - есть
Присвоение элементам через указатели - есть
Удаление - есть

Anikmar, Ваш вариант инициализации массива:
Код
// Заполнение элементами
for (i=0;i<Size0;i++)
    for(j=0;j<Size1;j++)
        for(k=0;k<Size2;k++)
            aMas[i][j][k] = rand() % 100;

Вариант инициализации с разыменованием через указатели:
for (i=0;i<Size0;i++)
    for(j=0;j<Size1;j++)
        for(k=0;k<Size2;k++)
            aMas[i][j][k] = *(*(*(a + i) + j) + k);[/code]
Разница понятна? По-моему мы разговариваем на разных языках...
Но, вообще, по мнению большинства, этот изврат не нужен, и, видимо, пора прикрывать дискуссии...
PM   Вверх
likehood
Дата 26.4.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24



Цитата(apook @  26.4.2007,  17:08 Найти цитируемый пост)
Компилятор встретив a[1] делает следующее *(a+1) стало быть так этот код работает на самом деле

Для одномерного массива все верно. Спор то с того и начался, что если размрность массива больше 1, компилятор все равно делает только одно разименование.
PM MAIL   Вверх
Anikmar
Дата 26.4.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(FiMa1 @  26.4.2007,  14:28 Найти цитируемый пост)
PS: to apook: а как С ПОМОЩЬЮ УКАЗАТЕЛЕЙ динамически разместить данный массив в памяти и, С ПОМОЩЬЮ УКАЗАТЕЛЕЙ, реализовать инициализацию не показал (ну и удаление массива само собой). Просвяти, плз. Заранее спасибо! 

Указатели вам подсказал apook
Как создавать массив и его удаляеть - есть в моем коде
Остается поменять индексный доступ на указатели - и все есть

На одном языке мы разговариваем. Суть вопроса - поменять синтаксис доступа к элементу с квадратных скобок на указатели. Больше ничего менять не надо, вот я и удивляюсь.

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



Посмотрите на постик, там уже есть и динамические массивы , и размышления на тему скорости их создания и обработки. А так же мысли по поводу "изврата" и других выражений людей, не желающих шевелить мозгами

Смотри сюда
PM MAIL   Вверх
apook
Дата 26.4.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В догоночку, для ясности smile
Код

#include<stdio.h>
#include<conio.h>

int main(void)
{
int i, j, c;
int a[ 3 ][ 3 ][ 3 ] = { {{111, 112, 113}, {121, 122, 123}, {131, 132, 133}},
                         {{211, 212, 213}, {221, 222, 223}, {231, 232, 233}},
                         {{311, 312, 313}, {321, 322, 323}, {331, 332, 333}} };


int *b;

b=&a[ 0 ][ 0 ][ 0 ];

for( i=0; i<3; i++ )
{
    for( j=0; j<3; j++ )
    {
        for( c=0; c<3; c++ )
            printf( " %d", *b++ );
        printf( "\t" );
        }
    printf( "\n" );
    }

getch();
}


Цитата

Смотри сюда

Ну и че ты это сюда сунул что там о чем то похожем говорили?
До фига мозги что-ли включены...


Это сообщение отредактировал(а) apook - 26.4.2007, 18:09


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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