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



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

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

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

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

task_t ossList[10] = {};

在运行时期间用CCD_ 3和CCD_

在同一个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)中,我初始化一个指向相同类型结构的指针。

task_t * ossList;

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

HLP_GetStruct(&ossList);

在那个C文件(Sub.C)中,我将指针指向"真正的"ossList结构体数组,然后不知何故,我得到了一个阵列指针!?

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

我可以通过访问索引

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

如何?

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

Sub.c

task_t ossList[10] = {};
DoSomethingWithStructArray();
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)
}

诀窍是访问ossList(如*ossListGet = ossList;)只会给您一个指向ossList[10]的第一个元素的指针;Top.c中初始化的指针不会"变成数组",而是指向ossList[0]

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

最新更新