Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 09:24     Многомерный массив и массив массивов #1
На паскале это синонимы. Например, всё валидно:
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++ существует только одно из этих двух понятий?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 09:24     Многомерный массив и массив массивов
Посмотрите здесь:

Многомерный массив, Си!!! C++
многомерный массив C++
C++ Многомерный массив
C++ многомерный массив
Многомерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 11:30     Многомерный массив и массив массивов #21
palva, не понял. Вы сказали, что
Цитата Сообщение от palva Посмотреть сообщение
в языке C есть двумерные массивы и есть массивы массивов.
Но в С нет массива массивов. Да, можно объявить массив указателей, но это именно массив указателей.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 11:40     Многомерный массив и массив массивов #22
char это не объект и операции * и [] имеют в языке предопределенное значение, хотя их можно переопределить. Массив в языке всегда реализуется как указатель на первый элемент, а элементы массива располагаются в памяти последовательно. Массив массивов это массив указателей (указатели расположены в памяти последовательно). Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей. Если при имени массива указана только часть индексов (или их вовсе нет), то компилятор интерпретирует это как указатель.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2012, 11:52     Многомерный массив и массив массивов #23
Цитата Сообщение от palva Посмотреть сообщение
char это не объект
там поправка
Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей
Там используется арифметика указателей = указатели.

Двумерный, трехмерный, тысячемерный - без разницы.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 11:54     Многомерный массив и массив массивов #24
Хотя, я не совсем прав. Если не хватает только одного индекса, то интерпретируется как указатель. Попробовал такой пример:
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;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2012, 12:16     Многомерный массив и массив массивов #25

Не по теме:

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


если массив содержит массив указателей, то значит он многомерный массив и хоть убейтесь об стену, ничего не изменится
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 12:24     Многомерный массив и массив массивов #26
Ну можете так считать. В таком массиве не определен диапазон второго индекса. В C# это особый сорт двумерных массивов.
Ну а C существуют настоящие массивы, реализация которых не требует хранения в памяти указателей на каждую строку массива. В них все строки имеют одинаковую длину.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2012, 12:31     Многомерный массив и массив массивов #27
Что значит могу так считать
А вы докажите, что массив, который содержит массив - это не массив массивов.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 12:47     Многомерный массив и массив массивов #28
Цитата Сообщение от daslex Посмотреть сообщение
Что значит могу так считать
Это значит, что это вопрос терминологии, с которым я не берусь спорить. Я готов общаться с вами на вашем языке.
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2012, 12:54     Многомерный массив и массив массивов #29
Цитата Сообщение от taras atavin Посмотреть сообщение
А на c/c++ нет самого понятия многомерного массива
Цитата Сообщение от daslex Посмотреть сообщение
если массив содержит массив указателей, то значит он многомерный массив
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Цитата Сообщение от palva Посмотреть сообщение
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
стоило ТС шум поднимать. Вот и выводы можно сделать В С/С++ есть понятие массива массивов.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 12:59     Многомерный массив и массив массивов #30
Ну вот массив массивов, реализуется конечно с использованием указателей, то есть указатели явно хранятся в памяти и переставлять строки можно переставляя указатели. Это бывает полезно для реализации сортировки строк.
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;
}
В многомерном массиве переставить строки это целая история. Отсортировать сроки будет затратнее по процессору.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 13:55  [ТС]     Многомерный массив и массив массивов #31
Цитата Сообщение от daslex Посмотреть сообщение
Сколько угодно называйте бегемота гиппопотамом, от этого он не перестанет быть бегемотом
Но и гиппопотамом тоже не перестанет.

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
В С/С++ есть понятие массива массивов.
Как и в паскале. Но паскаль позволяет писать, как хочешь.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.12.2012, 14:39     Многомерный массив и массив массивов #32
taras atavin, Короткий ответ прост: потому что С++ это не Паскаль. И не надо сравнивать. Изучайте спокойно язык, а не задавайтесь вопросом: "почему это есть в одном языке, а в другом нет?"
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 14:59  [ТС]     Многомерный массив и массив массивов #33
Я знаю язык и для меня не проблема сделать векторный индекс, интересна именно мотивация Страуструпа.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
20.12.2012, 15:06     Многомерный массив и массив массивов #34
Цитата Сообщение от taras atavin Посмотреть сообщение
Но паскаль позволяет писать, как хочешь.
мне одно удобно делать в Паскале
другое удобно в С++

Паскаль позволяет писать по другому, но ни в коем случае не как хочешь.
Потому что это разные языки и каждый заточен под свои задачи.
мотивация Страуструпа у Страуструпа в книжке написана. Там Введение есть
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 15:09  [ТС]     Многомерный массив и массив массивов #35
Что за книжка?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 15:13     Многомерный массив и массив массивов #36
Цитата Сообщение от taras atavin Посмотреть сообщение
интересна именно мотивация Страуструпа
Ну думаю она очевидна - совместимость с С - было бы странно, если бы массивы в С++ "работали" иначе, чем в С.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 15:18  [ТС]     Многомерный массив и массив массивов #37
А в чём будет не совместимость? Если
C++
1
a[i,j]
будет синонимично
C++
1
a[i][j]
, то компилятор спокойно проглотит программу на чистых сях с адресацией только в раздельные скобки для разных индексов, но позволит юзать и альтернативный синтаксис. Обратной же совместимости нет всё равно из-за классов.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.12.2012, 15:40     Многомерный массив и массив массивов #38
taras atavin, и зачем, если есть "неальтернативный" синтаксис? У запятой в С++, как и в С, другое значение, выделять отдельный случай для индексации - ИМХО просто лишняя нагрузка на компилятор, у языка и так грамматика не самая простая. Основной аудитории (знакомым с С) такой способ всё равно вряд ли был нужен. Вообщем, ИМХО, полезность крайне сомнительна. Про совместимость я пожалуй некорректно выразился, просто менять\добавлять что-то в отношении индексации имело бы мало смысла.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2012, 15:43     Многомерный массив и массив массивов #39
Цитата Сообщение от taras atavin Посмотреть сообщение
a[i,j]
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 15:47     Многомерный массив и массив массивов
Еще ссылки по теме:

C++ Многомерный массив
C++ многомерный массив
Многомерный массив. С++ C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 15:47  [ТС]     Многомерный массив и массив массивов #40
На паскале запятая тоже разделяет параметры. И она же разделяет индексы. Но в чём здесь отдельность? Два индекса - это два операнда, операнд есть параметр оператора, запятая на c/c++ разделяет параметры. Где же здесь намёк на отдельный случай?

Добавлено через 45 секунд
Цитата Сообщение от palva Посмотреть сообщение
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
Оба языка прямо запрещают такой синтаксис.
Yandex
Объявления
20.12.2012, 15:47     Многомерный массив и массив массивов
Ответ Создать тему
Опции темы

Текущее время: 14:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru