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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

20.12.2012, 09:24. Просмотров 2721. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многомерный массив и массив массивов (C++):

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

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

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

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

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

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

66
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 09:31 #2
В С++ многомерный массив это тоже массив массивов.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 09:59  [ТС] #3
Нет.
C++
1
2
3
4
float a[10][10][10]; //Одномерный массив одномерных массивов одномерных массивов флоатов
a[2,4][3]=2; // Попытка обращения как к двумерному массиву одномерных массивов флоатов, не валидна
a[2][4,3]=2; // Попытка обращения как к одномерному массиву двумерных массивов флоатов, не валидна
a[2,4,3]=2; // Попытка обращения как к трёхмерному массиву флоатов, не валидна
. Это мы для краткости при общении между собой делаем вид, что и на c++ эти понятия существуют оба и синонимичны. Но на самом деле это не так. На c/c++ существуют только одномерные массивы.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 10:06 #4
Цитата Сообщение от taras atavin Посмотреть сообщение
На c/c++ существуют только одномерные массивы.
Цитата Сообщение от daslex Посмотреть сообщение
В С++ многомерный массив это тоже массив массивов.
В С++ многомерный массив это одномерный массив массивов, причем массивов столько, сколько там измерений.

В Паскале также. Память, она и есть память.
Цитата Сообщение от taras atavin Посмотреть сообщение
Попытка обращения как к двумерному массиву одномерных массивов флоатов, не валидна
Просто синтаксис другой
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:11  [ТС] #5
Цитата Сообщение от daslex Посмотреть сообщение
Просто синтаксис другой
Не только.
Pascal
1
a[3]:=a[5];
копирует целый элемент-двумерный массив в другой такой же, а
C++
1
a[3]=a[5];
не может выполнить поэлементное копирование, надо писать цикл и вкладывать в него ещё один цикл, но в
Pascal
1
a[3]:=a[5];
эти циклы уже спрятаны в оператор и максимально оптимизированы, а в
C++
1
for (i=9; i>=0; --i) for (j=9; j>=0; --j) a[3][i][j]=a[5][i][j];
простор, чтоб помешать компилятору оптимизировать явные циклы, огромен. Кроме того, синонимы и не должны различаться ни чем, кроме написания и произношения. В данном случае разница должна ограничиваться только синтаксисом.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 10:17 #6
Цитата Сообщение от taras atavin Посмотреть сообщение
не может выполнить поэлементное копирование, надо писать цикл и вкладывать в него ещё один цикл, но
Это не значит, что многомерный массив в C++ это не массив массивов. Можно и без циклов обойтись
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:20  [ТС] #7
А неизбежно вытекает зависимость времени копирования от мозгов двух программистов, которые писали компилятор и приложение.

Добавлено через 20 секунд
Цитата Сообщение от daslex Посмотреть сообщение
Можно и без циклов обойтись
Это как?

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Это не значит, что многомерный массив в C++ это не массив массивов.
На паскале многомерный массив и массив массивов различаются только синтаксически и только при конкретном обращении, а при следующем обращении уже можно использовать другой синтаксис. На c/c++ нет второго синтаксиса, значит нет и синонима.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 10:20 #8
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:27  [ТС] #9
Цитата Сообщение от diagon Посмотреть сообщение
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
Простой пример: индесы элемента есть координаты центра описываемой этим элементом ячейки шлаковой ванны по разным осям. На паскале я могу обойтись тремя индексами, на c++ буду вынужден юзать один векторный индекс. А отсюда или лишний вызов на каждом шаге цикла контруктора вектора, или придётся явно указать, что все три счётчика есть поля вектора. На паскале ООП на пустом месте не навязывается, нет ни создания объекта для его использования в единственной операции, ни явного объединения индексов в единую сущность. А на c++ я вынужден или класть в стакан тонны синтаксического сахара, или маяться короткоживущими объектами. Вместо одной крупинки синтаксического сахара.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 10:27 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int N=5;
    const int M=10;
    int Arr[M][N];
 
    for (int i=0;i<M*N;i++) Arr[0][i]=i; //Инициализация двумерного массива числами по порядку имитируя одномерный
 
//Вывод массива на экран распространенным способом
    for (int i=0;i<M;i++)
    {
        for (int j=0;j<N;j++)
        {
            cout<<Arr[i][j]<<"\t";
        }
        cout<<endl;
    }
Докажи мне, что двумерный массив это не одномерный массив
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:36  [ТС] #11
Массив у меня динамический массив-объект. Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Докажи мне, что двумерный массив это не одномерный массив
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках. И это именно альтернативная синтаксическая конструкция, так что искать здесь семантическую разницу не нужно. Синонимы не могут различаться семантически, иначе это не синонимы.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 10:37 #12
Цитата Сообщение от taras atavin Посмотреть сообщение
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках.
и в памяти прямоугольная область отводится
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:38  [ТС] #13
Цитата Сообщение от daslex Посмотреть сообщение
и в памяти прямоугольная область отводится
И к ней ещё одна линейная с указателями на нулевые элементы массивов-элементов:
C++
1
Arr[i]
- это косвенная адресация указателя, а не эквивалент подвыражения arr+i*sizeof(int) в выражении arr+i*sizeof(int)+j. Но это к делу не относится: стандарт паскаля не гарантирует, что многомерный массив не может быть реализован на двойном указателе.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.12.2012, 10:40 #14
Цитата Сообщение от daslex Посмотреть сообщение
элементы двумерного массива адресуются двумя индексами через запятую в общих скобках
Это Паскаль
А В C++ первый индекс в первой скобке, второй во второй, третий в третей и т.д.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:46  [ТС] #15
Цитата Сообщение от daslex Посмотреть сообщение
Это Паскаль
А В C++ первый индекс в первой скобке, второй во второй, третий в третей и т.д.
В паскале можно так и так, но второй вариант соответствует массиву массивов, а через запятую - многомерному массиву. Семантически это одно и тоже, на то это и синонимы. Но это два альтренативных синтаксиса и два варианта прочтения. Как
C++
1
char s[]="fsajfashbd";
- нуль-терминальная строка на массиве чаров, а
C++
1
char s[]={'f', 's', 'a', 'j', 'f', 'a', 's', 'h', 'b', 'd', '\0'};
- массив чаров, представляющий нуль-терминальную строку.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 10:46
Привет! Вот еще темы с ответами:

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

Многомерный массив - C++
найти и напечатать значения и индексы минимального элемента в каждом рядке матрицы W(N,M)

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

Многомерный динамический массив - C++
Пользователь вводит размер массива Массив заполнняется рандомными (случайными) значениями 1-9 При условиях если: 1 вывеси на экран * ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.12.2012, 10:46
Ответ Создать тему
Опции темы

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