Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/32: Рейтинг темы: голосов - 32, средняя оценка - 4.53
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Многомерный массив и массив массивов

20.12.2012, 09:24. Показов 6891. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На паскале это синонимы. Например, всё валидно:
Pascal
1
2
3
4
5
6
7
var a:array[1..n]of array[1..n]of array[1..n] of real; {объявлен одномерный массив одномерных массивов одномерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
,
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n,1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
Pascal
1
2
3
4
5
6
var a:array[1..n]of array[1..n]of array[1..n] of real; {Объявлен одномерный массив двумерных массивов реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
var a:array[1..n,1..n]of array[1..n] of real; {объявлен двумерный массив одномерных массивов реалов}
begin
        a[1][2,3]:=2; {А обращаемся к нему как к одномерном массиву двумерных массивов реалов}
        a[1,2,3]:=2; {А здесь как к трёхмерному реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
,
Pascal
1
2
3
4
5
6
7
var a:array[1..n,1..n,1..n]of real; {объявлен трёхмерный массив реалов}
begin
        a[1,2][3]:=2; {А обращаемся к нему как к двумерному массиву одномерных массивов реалов}
        a[1][2,3]:=2; {А здесь как к одномерном массиву двумерных массивов реалов}
        a[3,4]:=a[5,5]; {И здесь как к двумерному массиву одномерных массивов реалов}
        a[1]:=a[8]; {И здесь как к одномерном массиву двумерных массивов реалов}
        a[6][8][4]:=2; {А здесь как к одномерному массиву одномерных массивов одномерных массивов реалов}
. А на c/c++ нет самого понятия многомерного массива. А теперь вопрос: почему? Почему на паскале это синонимы и почему на c/c++ существует только одно из этих двух понятий?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2012, 09:24
Ответы с готовыми решениями:

Многомерный массив. С++
Здравствуйте нужно решить две задачки. а) Найдите сумму всех элементов матрицы размером 6х6, состоящей из элементов вещественного типа...

Многомерный массив
Найти максимальный элемент в массиве. Размеры массива задайте сами. Сделайте три варианта программы. В первом элементы массива...

Многомерный массив
Вот надо решить задачу. Первую я сделал. Помогите пожалуйста со второй и если можно то без замудреного кода ) ...

66
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
20.12.2012, 11:30
Студворк — интернет-сервис помощи студентам
palva, не понял. Вы сказали, что
Цитата Сообщение от palva Посмотреть сообщение
в языке C есть двумерные массивы и есть массивы массивов.
Но в С нет массива массивов. Да, можно объявить массив указателей, но это именно массив указателей.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 11:40
char это не объект и операции * и [] имеют в языке предопределенное значение, хотя их можно переопределить. Массив в языке всегда реализуется как указатель на первый элемент, а элементы массива располагаются в памяти последовательно. Массив массивов это массив указателей (указатели расположены в памяти последовательно). Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей. Если при имени массива указана только часть индексов (или их вовсе нет), то компилятор интерпретирует это как указатель.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.12.2012, 11:52
Цитата Сообщение от palva Посмотреть сообщение
char это не объект
там поправка
Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей
Там используется арифметика указателей = указатели.

Двумерный, трехмерный, тысячемерный - без разницы.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 11:54
Хотя, я не совсем прав. Если не хватает только одного индекса, то интерпретируется как указатель. Попробовал такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main() {
    int ia[3][3] = {{2,3,4},{5,6,7},{8,9,0}};
    int *ip;
    int **ipp;
    ip = ia[0];
    cout << ip[1] << endl; // 3
//  ip = ia;  // не компилируется
//  ipp = ia; // не компилируется
  return 0;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.12.2012, 12:16

Не по теме:

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


если массив содержит массив указателей, то значит он многомерный массив и хоть убейтесь об стену, ничего не изменится
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 12:24
Ну можете так считать. В таком массиве не определен диапазон второго индекса. В C# это особый сорт двумерных массивов.
Ну а C существуют настоящие массивы, реализация которых не требует хранения в памяти указателей на каждую строку массива. В них все строки имеют одинаковую длину.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.12.2012, 12:31
Что значит могу так считать
А вы докажите, что массив, который содержит массив - это не массив массивов.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 12:47
Цитата Сообщение от daslex Посмотреть сообщение
Что значит могу так считать
Это значит, что это вопрос терминологии, с которым я не берусь спорить. Я готов общаться с вами на вашем языке.
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.12.2012, 12:54
Цитата Сообщение от taras atavin Посмотреть сообщение
А на c/c++ нет самого понятия многомерного массива
Цитата Сообщение от daslex Посмотреть сообщение
если массив содержит массив указателей, то значит он многомерный массив
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Цитата Сообщение от palva Посмотреть сообщение
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
стоило ТС шум поднимать. Вот и выводы можно сделать В С/С++ есть понятие массива массивов.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 12:59
Ну вот массив массивов, реализуется конечно с использованием указателей, то есть указатели явно хранятся в памяти и переставлять строки можно переставляя указатели. Это бывает полезно для реализации сортировки строк.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main() {
    typedef int arr[3];
    arr a[3];
    a[2][2] = 8;
    cout << a[2][2] << endl; // 8
  return 0;
}
В многомерном массиве переставить строки это целая история. Отсортировать сроки будет затратнее по процессору.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 13:55  [ТС]
Цитата Сообщение от daslex Посмотреть сообщение
Сколько угодно называйте бегемота гиппопотамом, от этого он не перестанет быть бегемотом
Но и гиппопотамом тоже не перестанет.

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
В С/С++ есть понятие массива массивов.
Как и в паскале. Но паскаль позволяет писать, как хочешь.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.12.2012, 14:39
taras atavin, Короткий ответ прост: потому что С++ это не Паскаль. И не надо сравнивать. Изучайте спокойно язык, а не задавайтесь вопросом: "почему это есть в одном языке, а в другом нет?"
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 14:59  [ТС]
Я знаю язык и для меня не проблема сделать векторный индекс, интересна именно мотивация Страуструпа.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
20.12.2012, 15:06
Цитата Сообщение от taras atavin Посмотреть сообщение
Но паскаль позволяет писать, как хочешь.
мне одно удобно делать в Паскале
другое удобно в С++

Паскаль позволяет писать по другому, но ни в коем случае не как хочешь.
Потому что это разные языки и каждый заточен под свои задачи.
мотивация Страуструпа у Страуструпа в книжке написана. Там Введение есть
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 15:09  [ТС]
Что за книжка?
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
20.12.2012, 15:13
Цитата Сообщение от taras atavin Посмотреть сообщение
интересна именно мотивация Страуструпа
Ну думаю она очевидна - совместимость с С - было бы странно, если бы массивы в С++ "работали" иначе, чем в С.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 15:18  [ТС]
А в чём будет не совместимость? Если
C++
1
a[i,j]
будет синонимично
C++
1
a[i][j]
, то компилятор спокойно проглотит программу на чистых сях с адресацией только в раздельные скобки для разных индексов, но позволит юзать и альтернативный синтаксис. Обратной же совместимости нет всё равно из-за классов.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
20.12.2012, 15:40
taras atavin, и зачем, если есть "неальтернативный" синтаксис? У запятой в С++, как и в С, другое значение, выделять отдельный случай для индексации - ИМХО просто лишняя нагрузка на компилятор, у языка и так грамматика не самая простая. Основной аудитории (знакомым с С) такой способ всё равно вряд ли был нужен. Вообщем, ИМХО, полезность крайне сомнительна. Про совместимость я пожалуй некорректно выразился, просто менять\добавлять что-то в отношении индексации имело бы мало смысла.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,931
Записей в блоге: 5
20.12.2012, 15:43
Цитата Сообщение от taras atavin Посмотреть сообщение
a[i,j]
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 15:47  [ТС]
На паскале запятая тоже разделяет параметры. И она же разделяет индексы. Но в чём здесь отдельность? Два индекса - это два операнда, операнд есть параметр оператора, запятая на c/c++ разделяет параметры. Где же здесь намёк на отдельный случай?

Добавлено через 45 секунд
Цитата Сообщение от palva Посмотреть сообщение
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
Оба языка прямо запрещают такой синтаксис.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2012, 15:47

многомерный массив
помогите сделать задачу через указатели Сформировать массив типа char размером в 7х5х8 элементов. Проинициализировать его случайными...

Многомерный массив, Си!!!
Дан массив целых чисел a. Изменить индексацию массива на a

Многомерный массив
Имеется вот такое задание: Создать программу, которая реализует журнал с оценками в виде двумерного массива (студенты - строки, оценки за...

Многомерный массив
Пожалуйста помогите написать программу. Выделить память под многомерный массив, заполнить его произвольным образом, передать...

многомерный массив
помогите пожалуйста написать программу: Дана целочисленная прямоугольная матрица. Определить: 1) количество отрицательных элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru