2012-06-15 6 views
0

Мне было интересно, можно ли достигнуть самого низкого уровня (уровня не указателя) n-мерного массива в C условно разыменовывая разные уровни указателей, пока вы не достигают слоя, который не указатели, как показано в следующем примере:Разъемы без указателей в C: n-мерные массивы

if(i_is_a_pointer){ 
    for(i = 0; i < some_given_length; i++){ 
    if((*i)_is_a_pointer){ 
     for(j = 0; j < some_given_length; j++){ 
     if((**i)_is_a_pointer)...etc. 
     } 
    } 
    } 
} 

, который будет вникать через массив либо до тех пор, пока не ударил не-указатель или исчерпала последний блок кода, написанного. Как можно было бы в C определить, является ли вещь указателем (я бы предположил, что sizeof будет работать, если целевой указатель был другого размера, чем адрес памяти), и будет выполняться оператор ** i ошибка компиляции или времени выполнения, если * i не был сам указателем?

Кроме того, какие языки и методы вы используете/можете порекомендовать для перемещения элементов без массива n-мерного массива, где n определяется во время выполнения?

+0

C - хороший язык при пересечении n демонических массивов. Это займет немного времени, используя динамически распределенные размеры, но это может быть очень мощный инструмент. – SetSlapShot

ответ

4

Многомерные массивы в C не являются, как вы, кажется, выводящими гнезда указателей, пока не достигнете конечного уровня. Это всего лишь блоки данных. Внешние размеры автоматически преобразуются в указатели в определенных контекстах: массив преобразуется в указатель на его первый элемент. Например,

int a[3][4][5]; 

можно также записать

typedef int INNER[5]; // array of 5 ints 
typedef INNER MIDDLE[4]; // array of 5 INNERs (not pointers) 
typedef MIDDLE OUTER[3]; // array of 3 MIDDLEs (not pointers) 
OUTER a; 

Тогда это также эквивалентные преобразования указателей массивов.

MIDDLE *pm = a; 
INNER *pi = a[0]; 
int *p = a[0][0]; 

и

int (*pm)[4][5] = a; 
int (*pi)[5] = a[0]; 
int *p = a[0][0]; 

И, наконец, так как С статически типизированных, нет никакого способа, или нужно анализировать типы во время выполнения, как вы пытаетесь сделать с вашими if заявления. В скомпилированной программе C отсутствует информация о типе.

+0

У меня создалось впечатление, что массив массивов в C будет указателем на нулевой элемент массива, который сам будет массивом, принимающим форму указателя на свой собственный нулевой элемент, который был бы некорректным вещь. Неправильно ли это впечатление, или вы и я думаем о разных значениях термина «гнездо указателей»? – CosmicComputer

+1

В c, распределение будет иметь один непрерывный блок памяти для многомерного массива. Поэтому, если у вас есть 'int Coordinates [10] [10] [10]', это ОДИН указатель ... на координаты [0] [0] [0] и передан, потому что он был выделен как 'int [10 * 10 * 10] ' – StarPilot

+1

@CosmicComputer, это впечатление неверное. То, что вы описываете, является * эмуляцией * N-мерного массива. «Реальный» 2-мерный массив в c является «массивом массивов». –