двухмерный массив равен одномерному?
От: Аноним  
Дата: 23.07.08 07:05
Оценка:
С точки зрения стандарта С и C++,
вот такой код валидный:

double a[5][4];
double *b = &a[0][0];
b[5 * 4 - 1] = 7.1;

?

Т.е. представление двухмерного массива в памяти, все время одномерный массив?
Re: двухмерный массив равен одномерному?
От: Bell Россия  
Дата: 23.07.08 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>С точки зрения стандарта С и C++,

А>вот такой код валидный:

А>
А>double a[5][4];
А>double *b = &a[0][0];
А>b[5 * 4 - 1] = 7.1;
А>

А>?

А>Т.е. представление двухмерного массива в памяти, все время одномерный массив?


Да, двумерный массив располагается в непрерывном блоке памяти "построчно".
Любите книгу — источник знаний (с) М.Горький
Re: двухмерный массив равен одномерному?
От: AOD Россия  
Дата: 23.07.08 07:30
Оценка: +1 -1
Здравствуйте, Аноним, Вы писали:

А>С точки зрения стандарта С и C++,

А>вот такой код валидный:

А>
А>double a[5][4];
А>double *b = &a[0][0];
А>b[5 * 4 - 1] = 7.1;
А>

А>?

А>Т.е. представление двухмерного массива в памяти, все время одномерный массив?


А как ты себе представлял, расположенный в памяти, двумерный массив?


А>double *b = &a[0][0];// - необязательно, достаточно сделать так:
double *b = &a; // Ты получишь адрес первого элемента массима
Re[2]: двухмерный массив равен одномерному?
От: Vamp Россия  
Дата: 24.07.08 21:40
Оценка:
B>Да, двумерный массив располагается в непрерывном блоке памяти "построчно".
Что прямо следует из того, что двумерный массив — это просто массив массивов, а массив располагается последовательно.
Да здравствует мыло душистое и веревка пушистая.
Re: двухмерный массив равен одномерному?
От: Uzumaki Naruto Ниоткуда  
Дата: 24.07.08 21:46
Оценка:
А>Т.е. представление двухмерного массива в памяти, все время одномерный массив?

У меня почему-то сомнения относительно того, что это есть стандарт, а не особенность реализации под конкретную платформу... Если стандарт — киньте ссылку на п.п.

Re[2]: двухмерный массив равен одномерному?
От: Vamp Россия  
Дата: 24.07.08 21:47
Оценка:
См. мой комментарий выше
Да здравствует мыло душистое и веревка пушистая.
Re[3]: двухмерный массив равен одномерному?
От: Uzumaki Naruto Ниоткуда  
Дата: 25.07.08 04:42
Оценка:
Вы Кен Томпсон или Денис Ритчи? Ссылку на стандарт

Re[4]: двухмерный массив равен одномерному?
От: AOD Россия  
Дата: 25.07.08 05:58
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

UN>Вы Кен Томпсон или Денис Ритчи? Ссылку на стандарт


Заняться тебе нечем!? Прочитай про устройство, распределение памяти и про оганизацию хранения в ней данных с аппаратной и программной точки зрения! Чувствую, много нового себе откроешь...
есть такая щтука — гуглем зовется. Попользуйся, литературы, я тебя уверяю, до куя и больше... Глядишь и на стандарт нарвешься...
Ну или попробуй хотя бы взять и почитать оригиналы книг, написанных выше перечисленными людьми...
Re[2]: двухмерный массив равен одномерному?
От: AKh  
Дата: 25.07.08 07:04
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

А>>Т.е. представление двухмерного массива в памяти, все время одномерный массив?


UN>У меня почему-то сомнения относительно того, что это есть стандарт, а не особенность реализации под конкретную платформу... Если стандарт — киньте ссылку на п.п.



8.3.4/7 Arrays
A consistent rule is followed for multidimensional arrays. If E is an n-dimensional array of rank
i× j× . . . ×k, then E appearing in an expression is converted to a pointer to an (n − 1 )-dimensional array
with rank j× . . . ×k. If the * operator, either explicitly or implicitly as a result of subscripting, is applied to
this pointer, the result is the pointed-to (n − 1 )-dimensional array, which itself is immediately converted
into a pointer.

Re[2]: двухмерный массив равен одномерному?
От: Maxim S. Shatskih Россия  
Дата: 25.07.08 16:18
Оценка:
UN>У меня почему-то сомнения относительно того, что это есть стандарт, а не особенность реализации под конкретную платформу... Если стандарт — киньте ссылку на п.п.

Страуструп/Эллис точно писали о том, что многомерный массив — это массив массивов.

Другое дело, что не надо путать с type**, который есть массив указателей на массивы.

Это одно из тех мест, где массив не есть указатель на первый элемент. Соответственно, массив массивов и массив указателей на первые элементы массивов — вещи разные.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: двухмерный массив равен одномерному?
От: sraider http://dvinogradov.blogspot.com
Дата: 27.07.08 21:05
Оценка:
А>>Т.е. представление двухмерного массива в памяти, все время одномерный массив?
UN>У меня почему-то сомнения относительно того, что это есть стандарт, а не особенность реализации под конкретную платформу... Если стандарт — киньте ссылку на п.п.

8.3.4
"it follows from all this that arrays in C++ are stored row-wise"

То есть если у тебя double a[5][4], то a[1][0] должен лежать по адресу (byte*)(&a[0]) + sizeof(double[4]).
И если sizeof(double[4]) == sizeof(double)*4 /*про это в стандарте не нашел, видимо компиляторы все-таки могут выравнивать в памяти*/, то тогда двумерный массив будет располагаться как одномерный.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.