我想写一个函数,有一个给定的数组和一个数字N,这个数字最后一次出现时,我想返回address
,如果找不到这个数字,我想使用一个NULL指针
我编写的代码的开头是:
int main(void) {
int n = 3;
int ary[6] = { 1,3,7,8,3,9 };
for (int i = 0; i <= 6; i++) {
if (ary[i] == 3) {
printf("%u\n", ary[i]);
}
}
return 0;
}
命令提示符中的结果:
3
3
我最大的麻烦是:
1.它将打印所有匹配项,但不是最后一个匹配项
1.我不太使用指针,所以不知道如何使用NULL指针
6条答案
按热度按时间lmyy7pcs1#
我发现你的程序有很多小问题:
1.如果你想创建一个函数,那么创建一个函数时,你的参数和返回类型是显式的,而不是直接在main中编码。
1.如果你只想对某件事的最后一次发生采取行动,不要对每一次都采取行动,只要把每一次新的发生都保存到同一个变量中,然后,当你确定它是最后一次发生时,就对它采取行动。
您描述的函数的最终版本为:
然后我会添加NULL指针就是0,我的意思是在运行时头文件中有一行“#define NULL 0”,这只是一个约定,内存地址0不存在,为了清晰起见我们使用NULL代替0,但这是完全一样的。
bnl4lu3b2#
漏洞:
i <= 6
访问数组超出界限,请更改为i < 6
。printf("%u\n", ary[i]);
打印值,而不是索引。n
进行比较,而是与硬编码的3
进行比较。我 * 认为 * 你正在寻找这样的东西:
指针
last_index
指向最后找到的项,如果有的话,通过减去数组的基地址last_index - ary
,我们进行指针运算,得到数组项。强制转换为
int
是必要的,以避免在C中减去指针实际上会得到一个名为ptrdiff_t
的大整数类型的结果-初学者不需要担心这个问题,所以只需强制转换即可。7nbnzgx93#
首先,您将从数组范围外读取,因为您的数组最后一个元素是5,而您读取的最多为6,这可能会导致分段错误。
致:
此号码最后一次出现时,我希望返回为地址。
您只打印值3,不打印地址。为此,您需要使用
&
运算符。如果找不到所述数字,我想使用NULL指针
我不明白,你想在哪里返回nullpointer?主函数不能返回nullpointer,这与它的定义相矛盾。要这样做,你需要把它放在单独的函数中,然后返回
NULL
。如果你想返回最后一次出现的结果,那么我将从这个数组的末尾开始迭代:
yzuktlbb4#
1.如果你想 * 返回一个地址 *,你需要使用一个函数,而不是用
main
写代码1.当你想要返回最后一个出现的地址时,你应该从最后一个元素向第一个元素迭代数组,而不是从第一个元素向最后一个元素迭代。
下面是这种功能的两种不同实现。
guz6ccqo5#
处理问题中的 * 指定要求 *(例如,一个 * 函数 * 搜索数字并返回其最后一次出现的地址,或
NULL
),下面的代码提供了一种满足这些要求的方法。nmpmafwu6#
到目前为止有很多答案,而且都是非常好的答案,所以我不会重复关于数组边界等的相同评论。
然而,我将采取不同的方法,并声明,“我想使用一个空指针”是这个任务的一个愚蠢的先决条件,它只会把一个非常简单的问题弄得混乱和复杂化。“我想使用......”是切掉你的鼻子来怨恨你的脸。
KISS的原则是“保持简单,圣......!!”那些将要阅读/修改你的代码的人会欣赏你的努力,而不是钦佩你做出了错误的决定,使他们的日子更糟。
数组很容易在索引到达每个元素方面进行构思。如果你想训练指针和空指针的使用,我建议你探索“链表”和/或“二叉树”。那些数据结构是建立在指针的实用性之上的。
考虑到要搜索的数组有很多兆字节。要找到最后一个匹配项,从数组的尾部而不是头部开始是有意义的。简单...