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

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

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

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

20.12.2012, 09:24. Просмотров 2581. Ответов 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++ существует только одно из этих двух понятий?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 09:24     Многомерный массив и массив массивов
Посмотрите здесь:
Многомерный массив C++
C++ Многомерный массив
многомерный массив C++
Многомерный массив, Си!!! C++
C++ Многомерный массив
Многомерный массив C++
C++ многомерный массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 09:31     Многомерный массив и массив массивов #2
В С++ многомерный массив это тоже массив массивов.
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++ существуют только одномерные массивы.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 10:06     Многомерный массив и массив массивов #4
Цитата Сообщение от taras atavin Посмотреть сообщение
На c/c++ существуют только одномерные массивы.
Цитата Сообщение от daslex Посмотреть сообщение
В С++ многомерный массив это тоже массив массивов.
В С++ многомерный массив это одномерный массив массивов, причем массивов столько, сколько там измерений.

В Паскале также. Память, она и есть память.
Цитата Сообщение от taras atavin Посмотреть сообщение
Попытка обращения как к двумерному массиву одномерных массивов флоатов, не валидна
Просто синтаксис другой
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];
простор, чтоб помешать компилятору оптимизировать явные циклы, огромен. Кроме того, синонимы и не должны различаться ни чем, кроме написания и произношения. В данном случае разница должна ограничиваться только синтаксисом.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 10:17     Многомерный массив и массив массивов #6
Цитата Сообщение от taras atavin Посмотреть сообщение
не может выполнить поэлементное копирование, надо писать цикл и вкладывать в него ещё один цикл, но
Это не значит, что многомерный массив в C++ это не массив массивов. Можно и без циклов обойтись
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:20  [ТС]     Многомерный массив и массив массивов #7
А неизбежно вытекает зависимость времени копирования от мозгов двух программистов, которые писали компилятор и приложение.

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

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Это не значит, что многомерный массив в C++ это не массив массивов.
На паскале многомерный массив и массив массивов различаются только синтаксически и только при конкретном обращении, а при следующем обращении уже можно использовать другой синтаксис. На c/c++ нет второго синтаксиса, значит нет и синонима.
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 10:20     Многомерный массив и массив массивов #8
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:27  [ТС]     Многомерный массив и массив массивов #9
Цитата Сообщение от diagon Посмотреть сообщение
По той же причине, по которой в языке нету свойств с параметрами - это всего лишь синтаксический сахар и ничего более.
Простой пример: индесы элемента есть координаты центра описываемой этим элементом ячейки шлаковой ванны по разным осям. На паскале я могу обойтись тремя индексами, на c++ буду вынужден юзать один векторный индекс. А отсюда или лишний вызов на каждом шаге цикла контруктора вектора, или придётся явно указать, что все три счётчика есть поля вектора. На паскале ООП на пустом месте не навязывается, нет ни создания объекта для его использования в единственной операции, ни явного объединения индексов в единую сущность. А на c++ я вынужден или класть в стакан тонны синтаксического сахара, или маяться короткоживущими объектами. Вместо одной крупинки синтаксического сахара.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
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;
    }
Докажи мне, что двумерный массив это не одномерный массив
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.12.2012, 10:36  [ТС]     Многомерный массив и массив массивов #11
Массив у меня динамический массив-объект. Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Докажи мне, что двумерный массив это не одномерный массив
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках. И это именно альтернативная синтаксическая конструкция, так что искать здесь семантическую разницу не нужно. Синонимы не могут различаться семантически, иначе это не синонимы.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 10:37     Многомерный массив и массив массивов #12
Цитата Сообщение от taras atavin Посмотреть сообщение
Элементарно: элементы двумерного массива адресуются двумя индексами через запятую в общих скобках.
и в памяти прямоугольная область отводится
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. Но это к делу не относится: стандарт паскаля не гарантирует, что многомерный массив не может быть реализован на двойном указателе.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 10:40     Многомерный массив и массив массивов #14
Цитата Сообщение от daslex Посмотреть сообщение
элементы двумерного массива адресуются двумя индексами через запятую в общих скобках
Это Паскаль
А В C++ первый индекс в первой скобке, второй во второй, третий в третей и т.д.
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'};
- массив чаров, представляющий нуль-терминальную строку.
palva
2561 / 1783 / 251
Регистрация: 08.06.2007
Сообщений: 6,910
Записей в блоге: 4
20.12.2012, 10:51     Многомерный массив и массив массивов #16
На самом деле в языке C есть двумерные массивы и есть массивы массивов. Они описываются и инициализируются по-разному. Их различие обнаруживается если мы попросим компилятор дать нам их длину. Компилятор их четко различает. Однако синтаксис обращения к элементам один и тот же, поскольку запятая в языке C занята под знак операции и ее использование внутри квадратных скобок имеет совсем другой смысл. Компилятор даже позволяет обращаться с двумерным массивом как с массивом массивов, но в реальных программах это вряд ли стоит использовать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main() {
  char sa[10][10];
  char *sp[]={"435", "", "sgjh"};
  cout << sizeof(sa) << endl; // 100
  cout << sizeof(sp) << endl; // 12
  sa[2][1] = sp[0][1];
  sp[1]=sa[2];
  cout << sp[1][1] << endl; // 3
  return 0;
}
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 11:04     Многомерный массив и массив массивов #17
Цитата Сообщение от taras atavin Посмотреть сообщение
второй вариант соответствует массиву массивов
а что такое массив массивов?

Добавлено через 11 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Можно и без циклов обойтись
Это как?
memcpy например
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
20.12.2012, 11:05     Многомерный массив и массив массивов #18
Цитата Сообщение от palva Посмотреть сообщение
C++
1
char *sp[]
Это массив указателей.
palva
2561 / 1783 / 251
Регистрация: 08.06.2007
Сообщений: 6,910
Записей в блоге: 4
20.12.2012, 11:12     Многомерный массив и массив массивов #19
Цитата Сообщение от gray_fox Посмотреть сообщение
Это массив указателей.
Конечно. А как еще иначе реализовать массив массивов? Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 11:27     Многомерный массив и массив массивов
Еще ссылки по теме:
C++ Многомерный массив
Многомерный массив. С++ C++
C++ Многомерный динамический массив
C++ многомерный массив.хелп
Запись в многомерный массив C++

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

Или воспользуйтесь поиском по форуму:
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
20.12.2012, 11:27     Многомерный массив и массив массивов #20
Цитата Сообщение от palva Посмотреть сообщение
Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
char *sp[]
здесь *sp[]= объект типа char
и какая разница? Вы сами сказали, что это массив массивов
Цитата Сообщение от palva Посмотреть сообщение
А как еще иначе реализовать массив массивов
Добавлено через 5 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.
Шаблоны вообще-то есть
Yandex
Объявления
20.12.2012, 11:27     Многомерный массив и массив массивов
Ответ Создать тему
Опции темы

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