这个问题的更好标题应该是如何将数组传递给函数。
所讨论的函数是不正确的 - 为了使这种方法起作用,我们需要改变签名 - 传递指向PPOST的指针。很可能这段代码的作者依赖于一个想法(而不是标准),即特殊值NULL(
哨兵)指定序列的结尾,对于分配给N + 1个指针的数组来说,在N个非空元素(指向结构体的指针)之后跟随N + 1个元素(指针),它将等于零。这个零指针将标记范围的结尾。当然,这是编码人员的责任 - 在调用函数之前通过将最后一个元素分配为NULL来标记指针数组的末尾。在调用函数之前,请执行以下操作:
PPOST *ptr = (PPOST*) malloc((N + 1)*sizeof(PPOST*));
ptr + N = NULL;
POST p;
compare_post( ptr, p)
int compare_post( PPOST *pp, POST p)
{
while( *pp ){
if(((*pp)->a == p.a )&&((*pp)->b == p.b )&&((*pp)->c == p.c ))
return 1;
pp++;
}
return 0;
}
你应该测试指针 - 解引用的指向指针 (*pp) - 而不是结构体 **pp 的值。也就是说,你将遍历数组直到达到第 N + 1 个元素。
更常见的方法(特别是在 C++ 标准库中广泛使用)是传递两个指针来指定范围的边界:序列的开始和结束位置:[beg, end)。其中,end 不包括在范围内。这样可以避免创建繁琐的指针数组:
PPOST ptr = (PPOST) malloc( N * sizeof(POST));
PPOST onePastTheEnd = ptr + N;
POST p;
compare_post( ptr, onePastTheEnd, p)
int compare_post( PPOST pp, PPOST end, POST p)
{
while( pp != end ){
if((pp->a == p.a )&&(pp->b == p.b )&&(pp->c == p.c ))
return 1;
pp++;
}
return 0;
}
一旦我们开始更改函数签名,我们也可以传递数组的大小 - 这是另一种方法。
PPOST
不是指针数组。 - Ry-pp
的输入参数不是PPOST *pp
,而是PPOST pp
,它不是指针。您没有使用指针。至少在我看来是这样的。我不知道是否应该使用PPOST *pp
而不是PPOST pp
。 - VandreyPPOST
并将其视为未给出的 typedef。为了迭代直到达到 哨兵 NULL,pp
必须是指向指针的POST
而不是指向POST
的指针。您的参数必须是类型POST **
。(抵制进一步破坏 typedef 指针的冲动)然后解引用pp
来检查NULL
或与p
的成员相等是有意义的。 - David C. Rankin