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

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

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

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

20.12.2012, 09:24. Просмотров 2812. Ответов 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
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 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;
}
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 11:04 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
второй вариант соответствует массиву массивов
а что такое массив массивов?

Добавлено через 11 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Можно и без циклов обойтись
Это как?
memcpy например
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.12.2012, 11:05 #18
Цитата Сообщение от palva Посмотреть сообщение
C++
1
char *sp[]
Это массив указателей.
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
20.12.2012, 11:12 #19
Цитата Сообщение от gray_fox Посмотреть сообщение
Это массив указателей.
Конечно. А как еще иначе реализовать массив массивов? Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 11:27 #20
Цитата Сообщение от palva Посмотреть сообщение
Можно еще как массив объектов, в которых переопределена операция []. Вы такую конструкцию называете массивом массивов?
char *sp[]
здесь *sp[]= объект типа char
и какая разница? Вы сами сказали, что это массив массивов
Цитата Сообщение от palva Посмотреть сообщение
А как еще иначе реализовать массив массивов
Добавлено через 5 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Да, есть ещё возможность каждый тип массива-элемента сделать отдельным классом. Но это тонны синтаксического дёгтя.
Шаблоны вообще-то есть
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
20.12.2012, 11:30 #21
palva, не понял. Вы сказали, что
Цитата Сообщение от palva Посмотреть сообщение
в языке C есть двумерные массивы и есть массивы массивов.
Но в С нет массива массивов. Да, можно объявить массив указателей, но это именно массив указателей.
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
20.12.2012, 11:40 #22
char это не объект и операции * и [] имеют в языке предопределенное значение, хотя их можно переопределить. Массив в языке всегда реализуется как указатель на первый элемент, а элементы массива располагаются в памяти последовательно. Массив массивов это массив указателей (указатели расположены в памяти последовательно). Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей. Если при имени массива указана только часть индексов (или их вовсе нет), то компилятор интерпретирует это как указатель.
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 11:52 #23
Цитата Сообщение от palva Посмотреть сообщение
char это не объект
там поправка
Двумерный массив это последовательное расположение в памяти его элементов и никаких дополнительных указателей
Там используется арифметика указателей = указатели.

Двумерный, трехмерный, тысячемерный - без разницы.
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 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
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 12:16 #25

Не по теме:

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


если массив содержит массив указателей, то значит он многомерный массив и хоть убейтесь об стену, ничего не изменится
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
20.12.2012, 12:24 #26
Ну можете так считать. В таком массиве не определен диапазон второго индекса. В C# это особый сорт двумерных массивов.
Ну а C существуют настоящие массивы, реализация которых не требует хранения в памяти указателей на каждую строку массива. В них все строки имеют одинаковую длину.
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 12:31 #27
Что значит могу так считать
А вы докажите, что массив, который содержит массив - это не массив массивов.
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
20.12.2012, 12:47 #28
Цитата Сообщение от daslex Посмотреть сообщение
Что значит могу так считать
Это значит, что это вопрос терминологии, с которым я не берусь спорить. Я готов общаться с вами на вашем языке.
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.12.2012, 12:54 #29
Цитата Сообщение от taras atavin Посмотреть сообщение
А на c/c++ нет самого понятия многомерного массива
Цитата Сообщение от daslex Посмотреть сообщение
если массив содержит массив указателей, то значит он многомерный массив
Цитата Сообщение от daslex Посмотреть сообщение
А вы докажите, что массив, который содержит массив - это не массив массивов.
Цитата Сообщение от palva Посмотреть сообщение
Я могу доказать обратное. Если массив содержит массив, то все его элементы содержат некоторый массив, (поскольку элементы массива имеют один и тот же тип.) Следовательно, это массив массивов.
стоило ТС шум поднимать. Вот и выводы можно сделать В С/С++ есть понятие массива массивов.
0
palva
2681 / 1908 / 287
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 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
20.12.2012, 12:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 12:59
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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