在 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。如果不指定数组的 sizedata[size] 的值实际上可以是任何值。

请注意,越界访问数组会导致未定义的行为。您将只获得该特定内存位置中剩余的任何值,可以是乱码,并且不能保证任何特定值(包括NULL)。

是的,第一个版本有一个主要优势:它确实有效!

你的不会的原因有两个:

  1. 您的版本循环直到找到 NULL。 NULL 要么是指向 0 的指针(这将不起作用),要么是 0。那么如果数组中有零怎么办?您将提前终止。

  2. 您的版本无法知道何时停止。如果在数组中找不到 value 怎么办?您将继续进行下去,直到内存中恰好为 0。数组不以 0 结尾,只有字符文字是。