c - 分配给指针的结构数组。发生了什么?

标签 c arrays pointers struct

<分区>

编辑: 通过索引 pointer[i] 与通过指针递增 pointer+1 访问数组指针中的元素有什么区别。 人们将此问题标记为与此 question 重复 我很难理解怎么办?当然,这是一个关于数组和指针的问题,但问题的相似之处到此为止。当然,对 C99 的引用可能会帮助某人更深入地挖掘 C99.. 但是,为什么要使用 SO? 结束编辑

我有一个结构(比如已定义以便所有 C 文件都可以访问它)

typedef struct
{
  uint8_t a;
  uint8_t b;
} task_t;

在一个 C 文件(比如 Sub.c)中,我创建了一个这样的结构数组

task_t ossList[10] = {};

在运行时进一步填充 ab 的值

在同一个 C 文件 (Sub.c) 中,我编写了一个函数,使其他 C 文件能够获取此结构数组。

void HLP_GetStruct(task_t ** ossListGet) {
    *ossListGet = ossList;
}

我从其他文件(比如 Top.c)获取结构的方式是:

    task_t * ossList;
    HLP_GetStruct(&ossList);

    for (k=0; k<nTasks; k++) {
        printf("OssList  %d %d", ossList[k].a, ossList[k].b)
    }

一切都很好。但是当我仔细观察时,我想知道这到底是怎么回事。到底发生了什么?

在我的外部 C 文件 (Top.c) 中,我将 a 指针初始化为相同类型的结构。

task_t * ossList;

然后我将引用传递给另一个 C 文件 (Sub.c)

HLP_GetStruct(&ossList);

在那个 C 文件 (Sub.c) 中,我将我的指针指向“真正的”ossList 结构 array 并且我以某种方式得到了一个指针 array !?

void HLP_GetStruct(task_t ** ossListGet) {
        *ossListGet = ossList;
    }

我可以通过以下方式访问索引

for (k=0; k<nTasks; k++) {
            printf("OssList  %d %d", ossList[k].a, ossList[k].b)
        }

如何?

(我以前从来没有这样做过,我的数组或多或少总是被声明为指针,默认情况下指针指向第一个元素,你可以“复制”指针等...)

子.c

task_t ossList[10] = {};
DoSomethingWithStructArray();
void HLP_GetStruct(task_t ** ossListGet) {
    *ossListGet = ossList;
}

顶.c

task_t * ossList;
HLP_GetStruct(&ossList);

for (k=0; k<nTasks; k++) {
  printf("OssList  %d %d", ossList[k].a, ossList[k].b)
}

最佳答案

诀窍是访问ossList(如*ossListGet = ossList;)给你一个指向ossList[10]<的第一个元素的指针;您在 Top.c 中初始化的指针不会“变成数组”,但最终会指向 ossList[0]

由于使用 pointer[i] 进行数组索引等同于将指针递增 i(即 pointer+i),您可以访问ossList[10] 的其他元素通过简单地增加指向第一个元素的指针 (ossList+k) 或者,理想情况下,使用 [] (ossList[k]).

关于c - 分配给指针的结构数组。发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46939890/

相关文章:

c - 制作一个函数来更新二维数组井字游戏表的 Action

JavaScript - 是否有一种简单的方法来获取嵌套 JSON 中每次出现的特定键的值

c++ - 将输入字符串转换为字符数组

C++ 对局部变量的引用与对参数的引用

c - 我应该在 C 和 C++ 中将临时变量声明带出循环吗?

c - 二维数组。第一个索引错误,其他所有正确

c - 如何使用十六进制表示法为 char* 赋值?

java - 如何修复此 Date 类,使日期在创建新的 Date 实例时启动后不能更改?

c - C 中用户定义的数组大小

C++删除成员函数中的临时节点?