1
struct individual {
    int element[100];
    int rank;
} ;

struct population{
    individual ind[10];
    individual *ind_ptr;
} ;

population p1,*p1_ptr;

p1_ptr = &p1;
p1_ptr->ind_ptr = &(p1_ptr->ind[0]);
p1.ind[0].element[0] = 1;
p1_ptr->ind_ptr->element[0] = 1;

最后的两个陈述表达了同样的事情。我想知道为什么我必须使用指针?指向索引的指针有什么好处吗?或者是否有使用“。”的偏好?和结构中的“->”?非常感谢你。

我再次编辑了我的代码,更正了 akash_sinha13134 和 Jonathan Leffler 指出的错误。感谢 mbratch 的评论。非常感谢你。

4

5 回答 5

3

我想知道为什么我必须使用指针?

你不必,这是你的选择。

指向索引的指针有什么好处吗?

在现代硬件上,它们之间几乎没有区别(如果有的话)。然而,在较旧的硬件上,指针提供了一些改进,因为您可以节省 CPU 周期,对索引进行指针运算。

在s中是否有使用.和的偏好?->struct

不,没有偏好:p->x是 的替代语法(*p).x,编译器将为两种构造生成相同的代码。

于 2013-09-06T12:59:32.503 回答
1

尽管上面的代码会在 C 中显示错误(不是在 C++ 中),因为在tagname没有关键字的情况下使用了结构struct(例如在 line 中population p1,*p1_ptr;).. 是否在 C 中使用指针作为结构纯粹是您的选择.. 使用指针可能是在某些情况下有利/有帮助,例如如果您想使用指针从结构类型函数返回多个值,这是可能的..但是如果您选择不使用指针,则不要..就这么简单...也dot(.) operator和是相同的(->) operator并且没有优先顺序..唯一的区别在于它们的使用....

于 2013-09-06T17:31:38.660 回答
0

在这个例子中,是的,两者ind_ptrind指向同一个内存位置,所以你不必使用指针。

但是,如果您想使用您ind_ptr的指向另一个数组individual,或者在运行时更改您在人口中使用的数组,您需要在那里使用指针,这就是这种方法有用的地方(在您的情况下,它不是,这可能会让你感到困惑)。

s->f实际上只是 的快捷方式(*s).f,其中s是指向包含 field 的结构的指针f,因此没有区别。

于 2013-09-06T13:01:11.927 回答
0
struct abcd aABCDStruct;
struct abcd * aPointerToABCDStruct;

点 (.) 用于结构变量,而箭头/不定向 (->) 用于指向结构的指针变量。

假设您知道上述内容,
那么没有区别,只是使用指向 的指针struct有助于您在使用数据结构(如链表)的情况下顺利转换。我们可以使用 迭代到列表的下一个变量ptr->next

于 2013-09-06T13:03:40.913 回答
0

指针是一个自给自足的实体:为了访问目标对象,您所要做的就是取消引用指针。指针实现直接绝对访问。

索引不是一个自给自足的实体:仅知道索引就无法访问任何内容。除了索引之外,您还需要知道应该应用此索引的数组。没有数组,索引本身是无用的。因此,索引实现了相对访问。

指针和索引各有利弊,这源于两者之间的上述根本区别。但是在两者可以互换的情况下(即当您知道数组总是预先知道时),您可以根据您的个人喜好进行选择。

于 2013-09-07T07:13:34.437 回答