c - 在 C 中使用结构访问数组

标签 c arrays structure

我了解如何创建可用于访问数组的结构,例如:

#include <stdio.h>

typedef struct {
  int i;
  int j;
  int k;
} MyStruct;

int main()
{
  MyStruct *ms;
  int array[9];
  int i;

  for(i=0;i<9;++i) array[i] = i;

  ms = (MyStruct *)array;

  for(i=0;i<3;++i) printf("%d %d %d %d\n",i,ms[i].i,ms[i].j,ms[i].k);
  return 0;
}

它允许我以 ms[1].i 的形式访问数组[0],以 ms[1].j 的形式访问数组[1],等等。但是,如果我想使用数组,我怎么能做同样的事情在运行时已知但在编译时未知的结构中?像这样的东西:

#include <stdio.h>

typedef struct {
  int *myArgs;
} MyStruct;

int main()
{
  MyStruct *ms;
  int array[9];
  int i;

  for(i=0;i<9;++i) array[i] = i;

  ms = (MyStruct *)array;

  for(i=0;i<3;++i) printf("%d %d %d %d\n",i,ms[i].myArgs[0],ms[i].myArgs[1],ms[i].myArgs[2]);
  return 0;
}

在该示例中,我会在运行时知道 myArgs 的长度为 3。但也有可能 myArgs 的长度为 9,在这种情况下 ms 的长度应为 1。

编辑:

我正在为 PDE 求解器存储一个解集,它有许多编译时固定的已知数,然后是未知数的额外数。例如,我的数组将包含 X、Y、Z,但之后可能还有 3、5 或 10 个。因此,我想提供一个结构,以便以后可以轻松访问字段,例如 solution.x、solution.y、solution.z、solution.chemicalSpecies[0]、solution.chemicalSpecies[1] 等。物种的数量在编译时是完全未知的。

我正在使用一个外部库,该库将未知数的数量存储为一个数组,我可以以 [k][j][i][numUnknowns] 的形式取回该数组,最好提供访问权限像解决方案[k][j][i].something.

最佳答案

没有。

在第一种情况下,结构的大小是 3 个 int 变量的大小。当您将数组的指针转换为结构的指针时,每 3 个 int 元素将与一个 MyStruct 元素匹配,代码中的魔力是什么(即理论上是不可移植的)。

在第二种情况下,结构的大小是指向 int 的 1 个指针的大小。您必须知道指针在用法上与数组有一些相似之处,但它们不是一回事。指针只是一个具有指向内存地址的单个值的变量。然后可以将该地址的内容用作数组。

在 C 中,结构和数组的大小是在编译时处理的,所以结构的大小在运行时不能改变,因此在你的结构中有一个指针对你的目的没有好处,因为指针大小也是固定的。

也许对您来说一个好的解决方案是使用抽象数据类型,例如:

typedef struct {
  int m; /* number of lines */
  int n; /* number of columns */
  int *data; /* pointer to the actual data */
} Matrix;

然后您可以创建辅助函数以使用该结构:

void matrix_new(Matrix *m, int rows, int columns);
int matrix_get(Matrix *m, int i, int j);
void matrix_set(Matrix *m, int i, int j, int value);
void matrix_free(Matix *m);

如果那样太笨拙,您甚至可以使用混合方法(不要太“抽象”类型):

int matrix_get(Matrix *m, int i, int j)
{
  return m->data[i * m->n + j];
}

int main()
{
  Matrix m;
  int array[9];
  int i;

  for(i=0;i<9;++i) array[i] = i;

  m.m = m.n = 3;
  m.data = array;

  for(i=0;i<3;++i)
    printf("%d %d %d %d\n", i,
                            matrix_get(&m, i, 0),
                            matrix_get(&m, i, 1),
                            matrix_get(&m, i, 2));
  return 0;
}

关于c - 在 C 中使用结构访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8478779/

相关文章:

c - C 中的数组初始化问题

c - 我在 Windows 上用 C 语言做了高分辨率计时?谁能指导我在 2 毫秒内调用特定函数?

c - C编程输出平均值

c++ - 指向结构的 std::vector 的指针

javascript - 如何在 localStorage 中存储数组?

javascript - 为数组中的每个对象调用内部方法

c - 在 C 中初始化包含位域的结构

c - 如何将结构体数据复制到字符串中?

C - 程序终止(fork() 和 exec())

arrays - 用许多数组构建结构