Как получить доступ к массиву структур указателей на списки в C? - PullRequest
1 голос
/ 05 апреля 2020
typedef struct A {
   struct B *b;                           
} A;

typedef struct B {
int x;                                                  
struct B *next;                                  
} B;


A Table[10];

Итак, у меня есть эти две структуры, и предполагается, что это массив структур A, который содержит указатели на другие структуры B (они собираются создать список). Я хочу получить доступ, например, к указателю table [5]. Мой код выдает ошибку «Несовместимые типы при назначении. Я не могу вносить изменения в форматирование структур. Вот мой код:

struct B* d_root;
d_root=Table->b[5];

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Идентификатор Table объявлен как имеющий тип массива

A Table[10];

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

d_root = Table[5].b;

или

d_root = ( Table + 5 )->b;

или

d_root = ( *( Table + 5 ) ).b;

В свою очередь, если указатель b указывает на динамически распределенный массив, то для выбора нужного элемента вы можно записать

d_root = Table[5].b[i];

или

d_root = ( Table + 5 )->b[i];

или

d_root = ( *( Table + 5 ) ).b[i];

, где i - это индекс в динамически распределенном массиве, на который указывает указатель b.

Чтобы получить доступ к элементу данных объекта, на который указывает указатель b, вы можете написать, например,

int x = Table[5].b[i].x;

или

int x = ( Table + 5 )->b->x;
0 голосов
/ 05 апреля 2020

вы должны использовать d_root = Table[5].b; вместо этого d_root=Table->b[5];

у вас есть массив таблиц и для доступа table[5] вы должны использовать Table[5].member не Table.member[5]

также примечание -> не является правильным оператором, посмотрите на использование ->:

struct *struct_name;

(*struct).struct_member;

, так как в приведенной выше программе мало жесткого кодирования, мы можем использовать:

struct *struct_name;

struct->struct_member;

, но с использованием оператора -> здесь Table[5]->b не так. (примечание: Table-> b верно, но оно будет указывать на первый из массива).

в вашем коде это Table->b[5] означает пятый элемент массива b в первом элементе массива Table.

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