2010-10-28 3 views
5

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

LList **array 

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

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

+0

Первоначально на вершине вы сказали, «указатель на массив ... [что] содержит указатели на связные списки», но ваш новый править теперь говорит «указатель на массив связанных списков». Который? – user470379

+0

хорошо catch. переиздан. указатель на массив указателей на связанные списки - это то, что им нужно. – Alex

+0

Я отредактировал свой ответ ниже, чтобы показать, как вы измените его размер. Это была ваша главная забота за новое редактирование, или есть что-то еще, что вам интересно? – user470379

ответ

5

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

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, если память не может быть выделена)

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

LList ***p_array; 
p_array = &array; 
+0

неправильный. вопрос был указателем на массив указателей на LList. ваше решение - это всего лишь массив указателей на LList. – user411313

+0

исправлено .......... – user470379

0

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

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. 

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

0

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

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

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


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

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

0
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); 
Смежные вопросы