【问题标题】:Pointer to a first structure in an array of structures?指向结构数组中的第一个结构的指针?
【发布时间】:2016-03-03 06:00:33
【问题描述】:

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

假设这是我的结构:

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 线程,但我仍然有点困惑,所以我很感激任何反馈。

【问题讨论】:

  • 试试这个格式化小技巧:将整个函数作为单个代码块输入。

标签: c pointers struct


【解决方案1】:

阅读本文后,我注意到您的帖子中有一些不一致之处:

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

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) 访问数组的“第 n 个”元素(后者是可能的,因为“数组”只不过是指向连续内存第一个元素的指针。 . 所以“添加” 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. 创建一个数组来访问大量项目,但您还不想分配所有内存。在这里,你真的别无选择。

【讨论】:

  • 我认为我需要创建一个指向结构的指针数组的原因是因为函数参数 struct str **ptr 它是一个指向结构的指针的指针,并且这个参数应该是指向数组的第一个元素。所以这就是为什么我得出结论,它确实必须是一个指向结构的指针数组,而不仅仅是一个结构数组。请注意,我无法修改此函数参数。但是现在想来,我可以设置一个结构数组,并将指向指针的指针设置为等于数组,因为它是指向第一个元素的指针?
  • 是的,你可以简单地获取一个指向数组的指针,它的类型是struct str**。比为元素单独分配内存要容易得多。
  • 好的。我有一个结构数组 struct str structure[ ];在我目前正在使用的函数中。数组的每个元素都填充有动态分配的结构。这个函数需要一个来自 main 的参数 struct str **ptr 并且应该使它指向数组的第一个元素。所以我创建了 struct str **ptr;在我的主函数中,我将它作为 (ptr) 传递给这个函数,在里面我将它设置为等于结构数组的名称。但是,当我想通过 main 中的这个指针访问数组时,它不起作用。出了什么问题?
  • 我不明白的是,如果您有一个简单的结构数组,为什么要动态分配数组中的每个元素。这就是我的意思:struct str *structures = malloc(20*sizeof(struct str)); 已经为您的条目分配了足够的内存。假设您有一个函数void myfn(struct str**)。那么你需要做的就是调用它是myfn(&structures);。如果你真的需要一个指针数组,那么你就这样做:struct str **structures = malloc(20*sizeof(struct str*));for(int i=0 ; i<20 ; ++i){structures[i] = malloc(sizeof(struct str));} 然后你就可以直接传递了。
  • ^请注意,在上述任何一种方法中,在函数内部使用数组应该是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2017-06-03
  • 2017-07-13
  • 2012-12-07
  • 2016-06-20
相关资源
最近更新 更多