我的教授建议我们也应该传递一个整数作为参数:
int abc(const int data[], int size, int value) {
int i= 0, ans= -1;
while (i < size && ans == -1) {
if (data[i] == value)
ans= i;
i++;
}
return ans;
}
但是,我认为没有必要在参数中添加整数大小。 我认为该功能可以更改为:
int abc(const int data[], int value) {
int i= 0, ans= -1;
while (data[i]!=NULL) {
if (data[i] == value)
ans= i;
i++;
}
return ans;
}
(我知道我们只是将数组的第一个元素的指针传递给函数!) 第一个版本比第二个版本更具优势吗?
答案 0 :(得分:3)
data[i]
int
值不应与NULL
进行比较。那是不正确的。
你应将大小作为单独的参数传递。
答案 1 :(得分:2)
将大小作为参数传递是一种很好的做法,可以在阵列格式错误时保护您免受分段错误的影响。
如果您完全确定该数组将包含0(这是NULL是什么)作为最后一个值,并且仅作为最后一个值,那么您的解决方案也可以正常工作。
但是,如果0是数组中的有效值,那么一旦遇到它就会停止。
答案 2 :(得分:2)
while (data[i]!=NULL)
- 无法保证data[size]
与您建议的NULL
相等。如果没有指定数组的size
,data[size]
的值实际上可能是任何值。
请注意,访问数组越界会导致未定义的行为。您将获得在该特定内存位置遗留下来的任何值,可以是乱码,并且不保证任何特定值(包括NULL
)。
答案 3 :(得分:2)
是的,第一个版本有一个主要优势:它实际上有效!
你的不理由有两个原因:
您的版本会循环,直到找到NULL
。 NULL是指向0的指针(不起作用),或0.如果数组中有零,该怎么办?你会提前终止。
您的版本无法知道何时停止。如果在数组中找不到value
怎么办?你会一直持续下去,直到内存中恰好是0。数组不以0结尾,只有字符文字。
答案 4 :(得分:1)
data[i]!=NULL
为了使这个工作,数组的最后一个元素之后的元素应该是NULL
,我认为不会是这种情况。 int
无法与NULL
进行比较。
但是,你可以做类似的事情。您可以使用标记标记数组的结尾
选择一些您确定不会出现在数组中的数字(可能您知道数组中的数字范围),让我们说99999
。然后将它保存在最后一个元素之后(请记住,您需要一个大小超过您想保留的元素的数组)。然后用它来检查数组的结尾。
int abc(const int data[], int value) {
int i= 0, ans= -1;
while (data[i]!=99999) {
if (data[i] == value)
ans= i;
i++;
}
return ans;
}
如果没有关于范围的信息
然后你必须将数组的大小和其他参数一起发送给函数。