gpt4 book ai didi

c - 声明数组的更好方法?

转载 作者:行者123 更新时间:2023-12-04 18:16:44 24 4
gpt4 key购买 nike

我正在用 C 语言编写并使用 GCC 进行编译。

有没有更好的方法来声明积分。我很惊讶地看到点是一个数组。是否有某种声明点的方法,所以它看起来更像一个数组。

typedef struct Span
{
unsigned long lo;
unsigned long hi;
} Span;

typedef struct Series
{
unsigned long *points;
unsigned long count;
unsigned long limit;
} Series;

void SetSpanSeries(Series *self, const Span *src)
{
unsigned long *points;

if (src->lo < src->hi )
{

// Overlays second item in series.
points = self->points; // a pointer in self structure
points[0] = src->lo;
points[1] = src->hi;
self->count = 1;
}
}

现在让我们说点指向一个数组结构。
typedef struct Span
{
unsigned long lo;
unsigned long hi;
} Span;


span *points[4];

现在我该如何编写这些代码行?我做对了吗?
points = self->points;  // a pointer in self structure
points[0].lo = src->lo;
points[0].hi = src->hi;

最佳答案

声明unsigned long *points , points是一个指针。它指向数组的开头。 arr[x]*(arr + x) 相同, 所以是否 arr是一个数组(在这种情况下,它获取数组的地址,添加 x 并取消引用“指针”)或指针(在这种情况下,它获取指针值,添加 x 并取消引用指针),arr[0]仍然获得相同的数组访问。

在这种情况下,您不能声明 points作为数组,因为您没有将其用作数组-您将其用作指向数组的指针。指针是浅拷贝——如果更改指针指向的数据,它会更改原始数据。要创建常规数组,您需要进行深层复制,这将阻止您在 pointer 中的更改。从影响阵列self ,这最终是你想要的。

事实上,你可以在不使用 points 的情况下重写整个内容。 :

void SetSpanSeries(Series *self, const Span *src)
{
if (src->lo < src->hi )
{
self->points[0] = src->lo;
self->points[1] = src->hi;
self->count = 1;
}
}

至于你的第二个例子,是的, points[0].lo是正确的。 points->lo也是正确的,只要您只访问 points[0] . (或 self->points[0].lo 如果您完全取出 points。)

关于c - 声明数组的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com