2013-05-02 5 views
1

Как вы объявляете массив массивов массивов? Скажем, у меня есть массив s[]. s[0] будет содержать другой массив a[] и a[0] будет содержать массив b[]. Как бы вы это сделали с указателями?Массив массивов массивов в C

+6

http://cdecl.org – 2013-05-02 19:36:25

+1

Вы хотите 's [0]' быть массивом или быть указателем на элементы массива? Вы хотите, чтобы 'a [0]' был массивом или был указателем на элементы массива? –

+0

Чтобы уточнить вопросы Эрика: один из них является «умным» индексированием и на самом деле является только одним большим массивом. Другой использует ссылки на фактические ссылки указателя, и конечный многомерный массив больше не смежнее. –

ответ

4
// b is an array of int. (N is some number.) 
int b[N]; 

// a Option 0: a is an array of M arrays of N int. (M is some number.) 
int a[M][N]; 

// a Option 1: a is an array of M pointers to int. 
int *a[M]; 
a[0] = b; 
// Other elements of a must also be assigned in some way. 

// s Option 0: s is an array of L arrays of M arrays of N int. (L is some number.) 
int s[L][M][N]; 

// s Option 1: s is an array of L arrays of M pointers to int. 
int *s[L][M]; 
s[0][0] = b; 
// Other elements of s must also be assigned in some way. 

// s Option 2: s is an array of L pointers to arrays of N int. 
int (*s[L])[N]; 
s[0] = a; // Can use a from a Option 0, not a from a Option 1. 
// Other elements of s must also be assigned in some way. 

// s Option 3: s is an array of L pointers to pointers to int. 
int **s[L]; 
s[0] = a; // Can use a from a Option 1, not a from a Option 0. 
// Other elements of s must also be assigned in some way. 

Есть также варианты, в которых каждый объект является указателем на его самом высоком уровне, а не массивом. Я не показал их. Им потребуется определить что-то, на что указывает указатель.

+0

+1: Хороший ответ, особенно для ответа на вопросы, которые должен был задать ОП, но недостаточно знал об этом. – wallyk

+0

Вы не хотите делать 's [0] = a' в опции 2? (чтобы сделать его 3-мерным) – anatolyg

+0

@anatolyg: Да, я думаю, что это лучше. –

0

Простой подход.

int length = 10; 

int b[5] = {0,1,2,5,4}; 

int c[7] = {1,2,3,4,5,6,7}; 

int** s = malloc(sizeof(int*) * length); 

s[1] = b; 
s[2] = c; 

и так далее ...

Этот пример для 2 слоя. Сделать указатель s***s и внести соответствующие изменения, чтобы сделать его 3 слоя.

+0

's + 1' и' s + 2' не являются lvalues ​​и не могут быть слева от назначений. Возможно, вы указали 's [1]' и 's [2]'. И это дает 's' всего два слоя, а не три запроса в вопросе. –

+0

@EricPostpischil ya вы правы. 's + 1' не компилируется. Но я думал, что 's + 1' является синтаксическим сахаром' s [1] '. Ссылка: Например, на языке C обозначение a [i] является синтаксическим сахаром для * (a + i) - Wikipedia. –

+0

@EAGER_STUDENT: 's + 1' не' * (s + 1) '. Звездочка делает мир различий. – dreamlax

Смежные вопросы