Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] A имеет тип (int [][10]) 14.10.03 12:19 Число просмотров: 1827
Автор: amirul <Serge> Статус: The Elderman
|
То есть массив массивов из десяти целых. И в принципе его можно привести к типу ((int [10])*) или как там записывается указатель на массив из 10-ти целых.
> 1. В массиве int A[10][10] ,- является ли A типом (int **) > ? > (Я так понял, что не является ,- он у меня функциями void a > (int ** b) наотрез не принимается Если размер известен заранее, то лучше передавать int b[][10] - все будет работать, если же нет, то выход для C - передавать двойной указатель и размерности (ну или засунуть тело массива и размерности в структуру и передавать везде указатель на нее) и ввести отдельную функцию индексирования этого массива. Ну или сделать массив указателей на одномерные массивы, как в последующем примере (который GG).
> и кроме того я последовательно память просмотрел ,- мой > вывод - массив размещен последовательно) :-)))) А что ты ожидал увидеть? :-)
> В конечном счете мне нужно было динамически выделить int > A[10][10]. > Как я понял new может выделить только последовальную > область, поэтому пришлось бы самому A[a][a*10+b];
> int ** GG, ee=0; > GG = new (int *) [10]; > while (ee<10) GG[ee++] = new int [10]; Это один из самых распространенных способов.
Использование new, говорит об использовании C++, а там есть куча хороших контейнеров. Например vector. Об этом позже.
> Странно, но это у меня работает как int GG[10][10], т. е. > как аналог int A[10][10], при том, что и void a (int ** b) > его принимает. Не странно.
> Я в принципе не до конца понимаю ситуацию, поэтому > расчитываю, что вы что-нибудь умное скажите и у меня все > станет на свои места. В C многомерный массив трактуется как массив массивов. Первое индексирование находит нужный одномерный массив, а второе - нужный элемент в этом массиве.
Чтобы лучше понять, что происходит, представь себе массив структур
struct S{
int a1;
int a2;
int a3;
int a4;
int a5;
};
struct S arr[5];
---
В памяти последовательно будут размещаться все эти структуры. Массив массивов не имеет принципиального отличия. int a[5][10] читается как (int a[10])[5]. И в памяти последовательно размещаются пять десятимерных массивов (именно так, потому как у скобок свой приоритет при составлении типа).
Операция a[i] - взятие индекса в C выполняется как взятие нужных данных по смещению (sizeof(*a) * i) от начала массива, то есть длина одной записи в массиве умножается на индекс.
В случае с int **a - невозможно определить размер второй размерности массива, вернее возможно, он равен 1 - поэтому компилятор и говорит о несоответсвии типов. Случай с массивом указателей работает потому, что все массивы одномерные: одномерный массив указателей на строки и по одномерному массиву с элементами каждой строки. Массив указателей можно имеет тип (int *)[], а его можно передавать как (int **)
> Что по этому поводу говорит стандарт языка C/C++ > и как решаются проблемы с динамическими многомерными > массивами (предполагаю, что все решается как-то более > элегантно) ? Используй vector<vector<int>>. Его описание есть и в MSDN и во всех описаниях STL.
Или остановись на массиве указателей на строки
ЗЫ: Смешение стилей программирования - не очень хорошая идея (в частности использование new в явно C-style программе). У C есть своя функция для выделения памяти: malloc, а new предназначена не для выделения памяти, а для создания объектов.
|
|
|