Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/17: Рейтинг темы: голосов - 17, средняя оценка - 4.82
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

20.12.2012, 09:24. Просмотров 2995. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 09:24
Ответы с готовыми решениями:

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

многомерный массив
помогите пожалуйста написать программу: Дана целочисленная прямоугольная...

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

многомерный массив
помогите сделать задачу через указатели Сформировать массив типа char...

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

66
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
20.12.2012, 11:30 #21
palva, не понял. Вы сказали, что
Цитата Сообщение от palva Посмотреть сообщение
в языке C есть двумерные массивы и есть массивы массивов.
Но в С нет массива массивов. Да, можно объявить массив указателей, но это именно массив указателей.
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 4
20.12.2012, 11:40 #22
char это не объект и операции * и [] имеют в языке предопределенное значение, хотя их можно переопределить. Массив в языке всегда реализуется как указатель на первый элемент, а элементы массива располагаются в памяти последовательно. Массив массивов это массив указателей (указатели расположены в памяти последовательно). Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей. Если при имени массива указана только часть индексов (или их вовсе нет), то компилятор интерпретирует это как указатель.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
20.12.2012, 11:52 #23
Цитата Сообщение от palva Посмотреть сообщение
char это не объект
там поправка
Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей
Там используется арифметика указателей = указатели.

Двумерный, трехмерный, тысячемерный - без разницы.
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 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;
}
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
20.12.2012, 12:16 #25

Не по теме:

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


если массив содержит массив указателей, то значит он многомерный массив и хоть убейтесь об стену, ничего не изменится
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 4
20.12.2012, 12:24 #26
Ну можете так считать. В таком массиве не определен диапазон второго индекса. В C# это особый сорт двумерных массивов.
Ну а C существуют настоящие массивы, реализация которых не требует хранения в памяти указателей на каждую строку массива. В них все строки имеют одинаковую длину.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
20.12.2012, 12:31 #27
Что значит могу так считать
А вы докажите, что массив, который содержит массив - это не массив массивов.
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 4
20.12.2012, 12:47 #28
Цитата Сообщение от daslex Посмотреть сообщение
Что значит могу так считать
Это значит, что это вопрос терминологии, с которым я не берусь спорить. Я готов общаться с вами на вашем языке.
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
20.12.2012, 12:54 #29
Цитата Сообщение от taras atavin Посмотреть сообщение
А на c/c++ нет самого понятия многомерного массива
Цитата Сообщение от daslex Посмотреть сообщение
если массив содержит массив указателей, то значит он многомерный массив
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Цитата Сообщение от palva Посмотреть сообщение
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
стоило ТС шум поднимать. Вот и выводы можно сделать В С/С++ есть понятие массива массивов.
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 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;
}
В многомерном массиве переставить строки это целая история. Отсортировать сроки будет затратнее по процессору.
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2012, 13:55  [ТС] #31
Цитата Сообщение от daslex Посмотреть сообщение
Сколько угодно называйте бегемота гиппопотамом, от этого он не перестанет быть бегемотом
Но и гиппопотамом тоже не перестанет.

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
В С/С++ есть понятие массива массивов.
Как и в паскале. Но паскаль позволяет писать, как хочешь.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
20.12.2012, 14:39 #32
taras atavin, Короткий ответ прост: потому что С++ это не Паскаль. И не надо сравнивать. Изучайте спокойно язык, а не задавайтесь вопросом: "почему это есть в одном языке, а в другом нет?"
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2012, 14:59  [ТС] #33
Я знаю язык и для меня не проблема сделать векторный индекс, интересна именно мотивация Страуструпа.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
20.12.2012, 15:06 #34
Цитата Сообщение от taras atavin Посмотреть сообщение
Но паскаль позволяет писать, как хочешь.
мне одно удобно делать в Паскале
другое удобно в С++

Паскаль позволяет писать по другому, но ни в коем случае не как хочешь.
Потому что это разные языки и каждый заточен под свои задачи.
мотивация Страуструпа у Страуструпа в книжке написана. Там Введение есть
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2012, 15:09  [ТС] #35
Что за книжка?
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
20.12.2012, 15:13 #36
Цитата Сообщение от taras atavin Посмотреть сообщение
интересна именно мотивация Страуструпа
Ну думаю она очевидна - совместимость с С - было бы странно, если бы массивы в С++ "работали" иначе, чем в С.
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2012, 15:18  [ТС] #37
А в чём будет не совместимость? Если
C++
1
a[i,j]
будет синонимично
C++
1
a[i][j]
, то компилятор спокойно проглотит программу на чистых сях с адресацией только в раздельные скобки для разных индексов, но позволит юзать и альтернативный синтаксис. Обратной же совместимости нет всё равно из-за классов.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
20.12.2012, 15:40 #38
taras atavin, и зачем, если есть "неальтернативный" синтаксис? У запятой в С++, как и в С, другое значение, выделять отдельный случай для индексации - ИМХО просто лишняя нагрузка на компилятор, у языка и так грамматика не самая простая. Основной аудитории (знакомым с С) такой способ всё равно вряд ли был нужен. Вообщем, ИМХО, полезность крайне сомнительна. Про совместимость я пожалуй некорректно выразился, просто менять\добавлять что-то в отношении индексации имело бы мало смысла.
0
palva
3097 / 2231 / 448
Регистрация: 08.06.2007
Сообщений: 8,129
Записей в блоге: 4
20.12.2012, 15:43 #39
Цитата Сообщение от taras atavin Посмотреть сообщение
a[i,j]
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
20.12.2012, 15:47  [ТС] #40
На паскале запятая тоже разделяет параметры. И она же разделяет индексы. Но в чём здесь отдельность? Два индекса - это два операнда, операнд есть параметр оператора, запятая на c/c++ разделяет параметры. Где же здесь намёк на отдельный случай?

Добавлено через 45 секунд
Цитата Сообщение от palva Посмотреть сообщение
Это означает одно и то же, что в C, что в C++. Не вижу здесь вопросов совместимости.
Оба языка прямо запрещают такой синтаксис.
0
20.12.2012, 15:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 15:47

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

Многомерный массив
найти и напечатать значения и индексы минимального элемента в каждом рядке...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru