将数组作为C中的参数传递

时间:2015-12-07 15:30:01

标签: c arrays function parameters parameter-passing

我的教授建议我们也应该传递一个整数作为参数:

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;
}

(我知道我们只是将数组的第一个元素的指针传递给函数!) 第一个版本比第二个版本更具优势吗?

5 个答案:

答案 0 :(得分:3)

data[i] int值不应与NULL进行比较。那是不正确的。

将大小作为单独的参数传递。

答案 1 :(得分:2)

将大小作为参数传递是一种很好的做法,可以在阵列格式错误时保护您免受分段错误的影响。

如果您完全确定该数组将包含0(这是NULL是什么)作为最后一个值,并且仅作为最后一个值,那么您的解决方案也可以正常工作。

但是,如果0是数组中的有效值,那么一旦遇到它就会停止。

答案 2 :(得分:2)

while (data[i]!=NULL) - 无法保证data[size]与您建议的NULL相等。如果没有指定数组的sizedata[size]的值实际上可能是任何值。

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

答案 3 :(得分:2)

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

你的不理由有两个原因:

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

  2. 您的版本无法知道何时停止。如果在数组中找不到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;
}

如果没有关于范围的信息

然后你必须将数组的大小和其他参数一起发送给函数。