在 C 中将数组作为参数传递
Pass array as parameter in C
我的教授建议我们也应该传递一个整数大小作为参数:
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;
}
(我知道我们只是将数组第一个元素的指针传递给函数!)
是不是第一个版本比第二个版本更有优势?
data[i]
是一个 int
值,不应与 NULL
进行比较。那是不正确的。
您应该将大小作为单独的参数传递。
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;
}
如果没有关于范围的信息
然后你必须将数组的大小连同其他参数一起发送给函数。
将大小作为参数传递是一种很好的做法,可以在数组格式错误时保护您免受分段错误的影响。
如果您完全确定数组将包含 0(即 NULL)作为最后一个值,并且仅作为最后一个值,您的解决方案也将有效。
但是,如果0是数组中的有效值,那么你一遇到它就停下来。
while (data[i]!=NULL)
- 不能保证 data[size]
会像您建议的那样等于 NULL
。如果不指定数组的 size
,data[size]
的值实际上可以是任何值。
请注意,越界访问数组会导致未定义的行为。您将只获得该特定内存位置中剩余的任何值,可以是乱码,并且不能保证任何特定值(包括NULL
)。
是的,第一个版本有一个主要优势:它确实有效!
你的不会的原因有两个:
您的版本循环直到找到 NULL
。 NULL 要么是指向 0 的指针(这将不起作用),要么是 0。那么如果数组中有零怎么办?您将提前终止。
您的版本无法知道何时停止。如果在数组中找不到 value
怎么办?您将继续进行下去,直到内存中恰好为 0。数组不以 0 结尾,只有字符文字是。
我的教授建议我们也应该传递一个整数大小作为参数:
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;
}
(我知道我们只是将数组第一个元素的指针传递给函数!) 是不是第一个版本比第二个版本更有优势?
data[i]
是一个 int
值,不应与 NULL
进行比较。那是不正确的。
您应该将大小作为单独的参数传递。
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;
}
如果没有关于范围的信息
然后你必须将数组的大小连同其他参数一起发送给函数。
将大小作为参数传递是一种很好的做法,可以在数组格式错误时保护您免受分段错误的影响。
如果您完全确定数组将包含 0(即 NULL)作为最后一个值,并且仅作为最后一个值,您的解决方案也将有效。
但是,如果0是数组中的有效值,那么你一遇到它就停下来。
while (data[i]!=NULL)
- 不能保证 data[size]
会像您建议的那样等于 NULL
。如果不指定数组的 size
,data[size]
的值实际上可以是任何值。
请注意,越界访问数组会导致未定义的行为。您将只获得该特定内存位置中剩余的任何值,可以是乱码,并且不能保证任何特定值(包括NULL
)。
是的,第一个版本有一个主要优势:它确实有效!
你的不会的原因有两个:
您的版本循环直到找到
NULL
。 NULL 要么是指向 0 的指针(这将不起作用),要么是 0。那么如果数组中有零怎么办?您将提前终止。您的版本无法知道何时停止。如果在数组中找不到
value
怎么办?您将继续进行下去,直到内存中恰好为 0。数组不以 0 结尾,只有字符文字是。