指向结构数组中第一个结构的指针?

时间:2015-11-29 15:23:14

标签: c pointers struct

我有一个应该创建结构并将它们存储在结构数组中的函数。

让我们说这是我的结构:

struct str {
    ...
};

该函数采用如下所示的参数:

struct str **ptr

如果我把它指向正确的指针指向结构的指针,那么我应该将此参数设置为指向结构数组的第一个元素,这将是该数组中的第一个结构。

所以,如果参数看起来像这样,那意味着我不是只有一个结构数组,而是有一个指向该结构的指针数组,对吧?

现在我已经声明了这样的结构指针数组:

 struct str *structures[20];

因为我希望有20个(指针)结构存储在那里。

然后我有一个为结构分配内存的循环,并将它们存储在数组中,如下所示:

 struct str *structure;

 structure = malloc(sizeof(struct str));

然后我填写我想要的结构参数:

structure->a = 1; structure->b = 2; .........

我将它存储在数组中:

structures[n] = structure;

我确保它通过从每个循环的结构中打印一个参数来存储在数组中我希望它的位置:

printf("%d\n", structures[7]->a);

我的问题是,如何将函数的参数设置为指向该数组中结构的第一个指针?

我做对了吗?

此外,该参数需要从main获取。

我需要在这个函数之外使用这些(指向)数组结构。

参数是什么样的?

struct str *pointer;

另外,是不是可以将指针指向数组本身,它应该自动指向其中的第一个元素?

因此我可以通过指针引用数组的第n个成员,因为我需要稍后使用它们?

我看过this帖子,但我仍然有点困惑,所以我很感激任何反馈。

1 个答案:

答案 0 :(得分:0)

通过这一点,我注意到你的帖子中有一些不一致的地方:

为什么要创建一个指向结构的指针数组而不是简单的结构数组?也就是说,假设你的结构有这个声明:

struct myStruct {
    int x;
    int y;
};

如果要创建这些结构的数组,请执行以下操作:

//dynamic
struct myStruct* myArray = malloc(20*sizeof(struct myStruct));
//static
struct myStruct* myArray[20];

请注意,这两个都返回指向数组的第一个元素的指针(类型为struct myStruct)。您的数组是struct myStruct元素数组,不是数组struct myStruct*

实际上,大小为20的struct myStruct元素数组只不过是连续的内存,足以容纳20个struct myStruct元素,并由指向第一个元素的指针表示。由于内存是连续的,你可以通过myArray[0]*(myArray+n)访问数组的'nth'元素(后者是可能的,因为“数组”只不过是指向第一个元素的指针。连续的内存...所以在给定类型的指针中“添加”1会给你下一个元素的内存地址...你可以使用*运算符来获取元素本身。

为结构数组分配内存而不是创建指向结构的指针数组会更容易(更不用说更快)。然后在适当的位置修改它们。

这是一个接收数组并增加第5和第6个元素的函数:

void modifyStructs (struct myStruct* myArray)
{
    //modify the fifth struct:
    ++myArray[4].x;
    //modify the sixth struct:
    ++myArray[5].x;
}

你想要一个指针数组的次数是:

  1. 创建多维数组。即便如此,这对于缓存性能来说真的很糟糕......最好创建一维数组并定义一个宏来获取元素。 BLAS / LAPACK就是这么做的。
  2. 创建一个数组,其中一些元素应为NULL并且您没有使用结构。如果你正在使用结构,那么最好只定义一个字段来识别你的结构是否已经填充并使用一个简单的结构数组。
  3. 创建一个数组来访问大量项目,但您还不想分配所有内存。在这里,你真的没有选择。