如何访问 C 中指向列表的指针结构数组?

Posted

技术标签:

【中文标题】如何访问 C 中指向列表的指针结构数组?【英文标题】:How do you access an array of structs of pointers to lists in C? 【发布时间】:2020-07-17 12:39:38 【问题描述】:
typedef struct A 
   struct B *b;                           
 A;

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


A Table[10];

所以我有这两个结构,它应该是一个结构 A 的数组,其中包含指向其他结构 B 的指针(它们将创建一个列表)。我想访问例如表 [5] 的指针。我的代码给了我一个错误“分配时类型不兼容。我无法对结构的格式进行任何更改。这是我的代码:

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

【问题讨论】:

不应该只是Table[5].b吗? Table->b[5] 表示struct B *b; 字段不是数组时是数组。 ` 【参考方案1】:

标识符 Table 被声明为具有数组类型

A Table[10];

所以要访问一个元素,你必须指定它的索引来使用指针算法。

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;

【讨论】:

【参考方案2】:

你应该使用d_root = Table[5].b; 而不是这个d_root=Table->b[5];

您有一个 Table 数组,要访问 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 的第一个元素中。

【讨论】:

以上是关于如何访问 C 中指向列表的指针结构数组?的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体指针成员所指向的变量如何访问?

给定一个指向内存地址的未知指针访问结构 - C

如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素

如何在C中释放指向结构的指针数组?

c语言如何给结构体指针赋值?

C ++在指向结构的指针中访问类数组指针