Указатель на массив указателей на связанные списки - PullRequest
5 голосов
/ 29 октября 2010

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

LList **array

Это была моя первая мысль, но это просто дает мне указатель на массив LList.Или, по крайней мере, это мое понимание.Может ли кто-нибудь помочь мне?Alex

EDIT: хорошо, немного информации о том, как это будет использоваться.Я реализую очень простую хэш-таблицу.есть структура, которая содержит указатель на массив указателей на связанные списки.это должен быть указатель на массив, чтобы при изменении размера таблицы я мог просто изменить указатель так, чтобы он указывал на таблицу большего размера.

Ответы [ 5 ]

5 голосов
/ 29 октября 2010

Звучит так, как будто вы на правильном пути.

LList **array;
array = malloc(num_ptrs * sizeof(LList*));

array теперь является массивом указателей на LList, а такие элементы, как array[3], будут указателями на LList.

Массивы и указатели очень похожи в C (но не идентичны!), Как показано на классическом примере: *(array + 2) в основном эквивалентно array[2].

Edit: Когда вам нужно изменить размер таблицы, вам просто нужно realloc дополнительное пространство:

LList **new_array;
new_array = realloc(old_array, new_size * sizeof(LList*));

new_array и old_array могут впоследствии или не совпадать с указателем, но в любом случае new_array гарантированно будет указателем на достаточно места для хранения нового массива (или NULL, если память не могла должно быть выделено)

2-е редактирование: Как упоминалось в user411313, если вам нужен фактический указатель на массив, вам нужно взять адрес массива:

LList ***p_array;
p_array = &array;
0 голосов
/ 29 октября 2010
typedef struct LList LList;
struct LList {
int value;
LList *next; };

LList *(*p)[3]; /* pointer to an array of 3 pointers to LList */
LList ll1 = {11};
LList ll2 = {22};
LList ll3 = {33};
size_t sizeofarray = sizeof*p/sizeof**p; /* calc arraysize at runtime here */
p = malloc( sizeofarray * sizeof**p ); /* allocate space for each LList-pointer in array */
(*p)[0] = &ll1;
(*p)[1] = &ll2;
(*p)[2] = &ll3;
/* test output here: */
printf("\n%d\n%d\n%d", ((*p)[0])->value,((*p)[1])->value,((*p)[2])->value);
free(p);
0 голосов
/ 29 октября 2010

Указатель на указатель также может быть массивом указателей.


int nLists; /* number of lists*/
LList **array;
array = (LList **)malloc(nLists * sizeof(LList *));

сделает array массивом указателей на LList. Тогда array[i] даст вам указатель на i-й связанный список в массиве.

0 голосов
/ 29 октября 2010

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

typedef struct LLNode {
    LLNode* next;
    int     data;
} LLNode;

LLNode* linkedList = null; // a linked list

LLNode**  linkedListArray = (LLNode**) malloc( arraySize* sizeof(LLNode*) );

LLNode*** pointerToLListArray = &linkedListArray;

с библиотекой связанного списка:

LList*  linkedListArray = (LList*) malloc( arraySize* sizeof(LList) );

LList** pointerToLListArray = &linkedListArray;
0 голосов
/ 29 октября 2010

Указатель на объект в основном совпадает с указателем на массив.

int * blah; // an int pointer. It could point to an array of ints, or a single int.
int ** blah; // a pointer to an int pointer. It could point to something that points to an int, or it could be pointing to an array of pointers to single ints, or it could be a pointer that points to an array of ints.

Все зависит от того, как вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...